Reputation: 2983
Until now I have always specified the format of the response for actions using a responds_to block, like so:
responds_to do |format|
format.js { render :json => @record }
end
Recently I realized that if you only support one format (as in the above example), you don't really need that block. Is it best practice to leave it in, or remove it?
Upvotes: 6
Views: 904
Reputation: 6965
I'm going to differ with existing answers--I like to have a responds_to
block for all of my actions. I find that, while slightly more verbose, it more clearly self-documents the action. It also makes it easy to support additional formats in the future. Edit: another advantage is it acts as a gatekeeper. Any format not declared in the block is automatically served a "406 Not Acceptable"
Upvotes: 2
Reputation: 37143
I would say not to use respond_to unless you have multiple response types.
It is simply extra code to understand and for your app to process and handle:
render :json => @record
Is much more concise than:
responds_to do |format|
format.js { render :json => @record }
end
Upvotes: 0
Reputation: 15500
I'm not really sure if this is best practice or not, but usually what I like to do is to leave the routes open to respond_to (i.e. by appending .:format
to the end), but only use it in the controllers when it's necessary.
Example:
routes.rb
map.connect :controller/:action/:id.:format
model_controller.rb
# Return a collection of model objects
def action_with_multiple_responses
@models = Model.all
respond_to do |format|
format.html #=> action_with_multiple_responses.html
format.xml { render :xml => @models }
end
end
# Return the first model object
def action_with_one_response
@model = Model.first
end
That way, you aren't cluttering up your action_with_one_response
method with an unnecessary block, but you also have set yourself up quite nicely if you want to someday return your object in xml, json, etc.
Upvotes: 0