JSONP response in Rails Controller
If you’re used to rendering your JSON response via call to_json on a collection on an object then it really is as simple as adding the callback option to render. You must ensure the callback parameter on the client end is the correct parameter than you feed to the callback option in your controller. This allows your JSON to be server without or without wrapping the response with a callback function depending on whether you include the callback parameter.
class Api
def index
respond_to do |format|
format.json do
render :json => Thing.all.to_json, :callback => params[:callback]
end
end
end
end
However, if you use JBuilder or any other JSON template engine then you’ll need to do things slightly differently. Here There is no need to change your controller method at but instead you can wrap the json repsonse in an after_filter which is a little cleaner.
class Api < ApplicationController
after_filter :wrap_response_with_callback
def index
respond_to do |format|
format.json
end
end
private
def wrap_response_with_callback
if request.get? && params[:callback] && params[:format].to_s == 'json'
response['Content-Type'] = 'application/javascript'
response.body = "%s(%s)" % [params[:callback], response.body]
end
end
end