Как СУШИТЬ контроллеры Rails 3, переопределив такие методы, как response_with?

Я пытаюсь создать JSONP API для моего приложения Rails 3 . Прямо сейчас в моих контроллерах у меня есть много действий, которые следуют этому шаблону:

# This is from my users_controller.rb, as an example

def index
  @users = User.all
  respond_with(@users, :callback => params[:callback])
end

Хотя это работает как есть, я хотел бы ОСУШИТЬ его, не повторяя : callback => params [: callback ] в каждом вызове действия response_with . Как я могу это сделать?

Обновление: Одна вещь, которую я понял, что некрасиво в моем приведенном выше коде, это то, что : callback => params [: callback] будет передан для любого формата ответа, а не только JSON. Следующий код, вероятно, более правильный:

def index
  @users = User.all
  respond_with(@users) do |format|
    format.json { render :json => @users, :callback => params[:callback]}
  end
end

Я рассмотрел несколько способов решения этой проблемы, но я не могу понять, как заставить их работать:

  • Override render ( возможно, в контроллере приложения), чтобы он принимал параметр : jsonp , который автоматически включает параметр : callback => params [: callback] . Таким образом я мог бы изменить приведенный выше код на следующий, который несколько короче:
def index
  @users = User.all
  respond_with(@users) do |format|
    format.json { render :jsonp => @users}
  end
end
  • Создать ответчик, который переопределяет to_json , чтобы решить мою проблему. Таким образом, я мог пропустить блок и просто позвонить response_with (@users,: responseder => 'MyResponder') , чтобы решить проблему. Или, возможно, я мог бы включить этот код в ответчик приложения, используя гем респондеров plataformatec , чтобы было достаточно response_with (@users) .

7
задан evanrmurphy 17 December 2010 в 17:39
поделиться