0

环境

  • 导轨 3.2.6
  • 红宝石 1.9.3p194

我发现了什么

class ThemesController < ApplicationController
  def show
  end
end

/views/themes/show.html.erb无论 URL 扩展名是什么,此设置都将始终呈现页面。例如:

http://localhost/themes/1.json
http://localhost/themes/1.xxx
http://localhost/themes/1.custom_ext
...

遇到

我想render :json=>@theme在扩展名时运行json,否则,渲染show.html.erb页面,所以我改变了我的代码:

respond_to do |format|
  format.json { render :json => @theme}
  format.any {render}
end

render :json=>@theme当 URL 扩展为 时 ,它将正确运行,并在,等中.json呈现。show.html.erb.xml.html

但是,我进入406 Not Acceptable, .xxx, .ooo.custom_ext发现这是因为只允许支持的 MIME 类型。

临时解决方案

class ThemesController < ApplicationController
  def show
    if params[:format].present? && params[:format] == "json"
      render :json => @theme
    end
  end
end

它工作正常,并且在提供超过 2 种格式时,例如.xml, .json,.yaml等:

class ThemesController < ApplicationController
  def show
    case params[:format]
    when "json" then render :json => @theme
    when "xml" then render :xml => @theme
    ...
    else render
    end
  end
end

它看起来很干净,不比respond_to风格差:D

问题

  1. 我想知道是否还有其他更好的解决方案?
  2. 如果case语句可以做所有respond_to可以做而不能做的事情respond_to,我为什么要使用respond_to
4

1 回答 1

2

非常有用的东西,就像通常发生的那样,可以在API 文档中找到。

请注意那里的注释:请注意,我们使用 Mime::CSV 作为 Rails 附带的 csv mime 类型。对于自定义渲染器,您需要使用 Mime::Type.register 注册 mime 类型。

你必须把这些东西放在 config/initializers/mime_types.rb 中。您会发现很少有注册非默认类型的示例。

预定义类型在这里

于 2012-06-18T06:23:51.037 回答