环境
- 导轨 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
问题
- 我想知道是否还有其他更好的解决方案?
- 如果
case
语句可以做所有respond_to
可以做而不能做的事情respond_to
,我为什么要使用respond_to
?