【发布时间】:2014-02-18 15:04:14
【问题描述】:
我的大多数控制器仅在 HTML 中具有有意义的响应。考虑以下场景:
我做了一个简单的控制器
class FrontController < ApplicationController
def index
end
end
并提供app/views/front/index.html.erb。如果我使用Accept: text/html 执行该操作,它会按预期呈现该模板。
如果我使用Accept: application/xml 进行该操作,我想获得406 Not Acceptable。相反,Rails 会引发 ActionView::MissingTemplate 异常,并显示 500 错误:
缺少模板前端/索引,应用程序/索引与 {:locale=>[:en], :formats=>[:xml], :handlers=>[:erb, :builder, :raw, :ruby, : jbuilder, :coffee]}.
我可以通过两种方式从控制器中获取406 Not Acceptable。首先,我可以使用respond_to 块:
class FrontController < ApplicationController
def index
respond_to do |f|
f.html
end
end
end
其次,我可以使用respond_with,尽管它在不代表资源的控制器中看起来很奇怪:
class FrontController < ApplicationController
respond_to :html
def index
respond_with # No arguments, because there's nothing to put here.
end
end
其中任何一个都将使用406 响应 XML 请求。但是,两者都需要向每个控制器操作添加代码。
这是我想做的事情:
理想情况下,如果未找到模板,我希望隐式呈现的操作(未声明
render调用或显式格式)返回406。一般来说,这对于 Rails 来说似乎是一个明智的默认设置,我很惊讶它还没有这样做。
1234563
想法?
(Rails 4.0.1,Ruby 2.0.0)
【问题讨论】:
-
这并不能回答您的问题,但它包含很多相关信息并且可能对其他通过您的问题的人有所帮助:Methods for limiting the Rails render format to html。
-
stackoverflow.com/questions/4643738/… 我想这就是你要找的
标签: ruby-on-rails