在Rails 3中,respond_to和format.all的工作方式与Rails 2不同?

代码

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 

以上内容适用于Rails 2.2.2。 但是在Rails 3中,在浏览器上获取controller / index.html或索引都将落入最后一行:“目前仅支持HTML和JSON格式。”

我能找到的唯一Rails文档是

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

目前只说:

 respond_to :html, :xml, :json 

但他们需要单独的json和xml模板,并且无法处理“目前仅支持HTML和JSON格式”的情况。

在rails3中你会写:

 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 

但这仅适用于文件顶部的respond_to块,详细说明了预期的格式。 例如

 respond_to :xml, :json, :html 

即使在这种情况下,如果有人例如询问js格式,则触发any块。

您还可以单独使用respond_to ,如下所示:

 @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 

希望这可以帮助。

你可能会发现观看这一段railscasts很有用,它说明了Rails 3中控制器的变化,特别是对响应者类的更改(将respond_to置于控制器类本身,并且仅在动作中使用respond_with @object):

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

以下适用于我。 我相信你必须明确指定html的“render”部分,否则它将使用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