我想为我的Rails 3应用程序创建一个JSONP API。现在在我的控制器,我有很多的其遵循这种模式操作:如何通过覆盖像respond_with方法干掉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')
即可解决问题。或者,也许我可以使用plataformatec's responders gem将此代码包含在应用程序响应程序中,这样respond_with(@users)
本身就足够了。
谢谢,这是一个很好的观点! – evanrmurphy 2011-03-11 20:22:01