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

nonopolarity picture nonopolarity · Sep 8, 2010 · Viewed 35.4k times · Source

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.

Answer

nathanvda picture nathanvda · Apr 15, 2011

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.