Я пытаюсь создать 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]
в каждом вызове действия respond_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
Есть несколько способов, которые я рассматривал для решения этой проблемы, но я не могу понять, как заставить их работать:
- Переопределите
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')
, чтобы решить проблему. Или, возможно, я мог бы включить этот код в ответчик приложения, используя гем ответчиков платформы, чтобыrespond_with(@users)
самого по себе было достаточно. .