In Rails 3, respond_to and format.all works differently than Rails 2?

the code

respond_to do |format|
  format.html
  format.json { render :json => @switches }
  format.xml { render :xml => @switches.to_xml }
  format.all { render :text => "only HTML, XML, and JSON format are supported at the moment." }
end

the above will work in Rails 2.2.2. But in Rails 3, getting controller/index.html or index on the browser will both fall into the last line: "only HTML and JSON format are supported at the moment."

The only Rails doc I can find on this is

http://api.rubyonrails.org/classes/ActionController/MimeResponds/ClassMethods.html#method-i-respond_to

which current only states:

respond_to :html, :xml, :json

but they need separate templates for json and xml, and can't handle the "only HTML and JSON format are supported at the moment" case.

Answers


In rails3 you would write:

respond_with(@switches) do |format|
  format.html
  format.json { render :json => @switches }
  format.xml  { render :xml  => @switches }
  format.all  { render :text => "only HTML, XML, and JSON format are supported at the moment." }
end

But this only works in correspondence with a respond_to block at the top of the file, detailing the expected formats. E.g.

respond_to :xml, :json, :html

Even in that case, if anybody for instance asks the js format, the any block is triggered.

You could also still use the respond_to alone, as follows:

@switches = ...
respond_to do |format|
  format.html {render :text => 'This is html'}
  format.xml  {render :xml  => @switches}
  format.json {render :json => @switches}
  format.all  {render :text => "Only HTML, JSON and XML are currently supported"}
end

Hope this helps.


You may find it useful to watch this episode of railscasts, which illustrates the changes to controllers in Rails 3 and in particular the changes to the responder class (putting respond_to in the controller class itself and only using respond_with @object in the action):

http://railscasts.com/episodes/224-controllers-in-rails-3


The following works for me. I believe you have to specify the "render" part for html explicitly or it will use the format.any.

respond_to do |format|
  format.html { render :html => @switches }
  format.json { render :json => @switches }
  format.xml  { render :xml  => @switches }
  format.all  { render :text => "we only have html, json, and xml" }
end

Need Your Help