我正在尝试为我的 Rails 3 应用程序创建 JSONP API。现在在我的控制器中,我有很多遵循这种模式的操作:
# 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')
解决问题。或者,也许我可以使用plataformatec 的响应程序 gem将此代码包含在应用程序响应程序中,这样respond_with(@users)
就足够了。