Я пытаюсь создать JSONP API для своего приложения Rails 3. Сейчас в моих контролеров, у меня есть много действий, которые следуют этому образцу:Как высушить контроллеры Rails 3 путем переопределения таких методов, как response_with?
# 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]
в вызове каждого действия на respond_with
, Как я могу это сделать?
Update: Одна вещь, которую я понял, что это некрасиво о моем коде выше является то, что вариант :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
для того, чтобы решить мою проблему. Таким образом я мог бы оставить блок и просто позвонитьrespond_with(@users, :responder => 'MyResponder')
, чтобы решить проблему. Или, может быть, я мог бы включить этот код в ответчик приложения, используя plataformatec's responders gem, чтобы было достаточноrespond_with(@users)
.
Спасибо, это очень хороший момент! – evanrmurphy 2011-03-11 20:22:01