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

25

代码

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或者index时都会落入最后一行的提示:"目前仅支持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格式”的情况。

3个回答

44

在 Rails 3 中,你应该写:

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

希望这能有所帮助。


我认为调用 to_xml 是多余的。默认的Rails 3响应器应该会自动调用它。 - dogenpunk
1
format.any 对我来说和 format.all 有相同的问题。这个链接可能与此相关:http://blogs.thewehners.net/josh/posts/354-obscure-rails-bug-respond_to-formatany - dreeves
@dogenpunk:当然是正确的。我编辑了我的答案来展示这一点。我还添加了一个纯粹的respond_to示例(并进行了澄清)。@dreeves:对我来说,它只是起作用了,你提到的博客文章在Rails术语中已经过时了 :) - nathanvda
它原本是 format.any,但我将其编辑为 format.all,因为 format.any 是另一种不同的东西,它会接受参数,例如 format.any(:html, :json) - Dorian
你正在测试哪个Rails版本?因为这段代码是可以运行的。 - nathanvda

3
您可能会发现观看这一期的railscasts会很有帮助,它展示了Rails 3中控制器的变化,特别是响应器类的变化(将respond_to放在控制器类本身中,并且只在操作中使用respond_with @object): http://railscasts.com/episodes/224-controllers-in-rails-3

0
以下方法适用于我。我相信你必须明确指定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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接