我们最终会有很多
ActionView::MissingTemplate (Missing template presentations/show, application/show with {:locale=>[:en], :formats=>["image/*"], :handlers=>[:erb, :builder, :raw, :ruby, :coffee, :haml]}
在我们的日志中。
应用程序目前仅执行HTML,因此我希望所有其他格式返回406(或其他)。有没有办法为所有渲染调用设置一次?或者我们是否必须到处散布respond_to
?
谢谢!
答案 0 :(得分:1)
您可以向rescue_from
添加ApplicationController.rb
行:
class ApplicationController < ActionController::Base
rescue_from ActionView::MissingTemplate do |e|
render nothing: true, status: 406
end
# ...
end
如果我尝试在我的Rails应用程序中访问document.xml
(而不是document.pdf
),Firefox会在浏览器控制台中显示以下消息:
GET http://localhost:3000/quotes/7/document.xml [HTTP/1.1 406 Not Acceptable 29ms]
答案 1 :(得分:1)
我最终选择了混合解决方案,因为我无法让respond_to
工作。每当有人尝试某些不受支持的mime类型时,这将发送406。
before_filter :ensure_html
def ensure_html
head 406 unless request.format == :html
end
答案 2 :(得分:0)
将respond_to :html
放在ApplicationController
答案 3 :(得分:0)
您可以按照以下方式执行此操作
class UsersController < ApplicationController
respond_to :html
def index
@users = User.all
respond_with(@users)
end
end
它respond
html actions
users
controller
ApplicationController
或者如果您想响应所有控制器
然后将其添加到 class ApplicationController < ActionController
respond_to :html
end
只需
class UsersController < ApplicationController
def index
@users = User.all
respond_with(@users)
end
end
和
{{1}}
答案 4 :(得分:0)
如果在运行操作之前未使用respond_with
或希望ActionView::MissingTemplate
被引发(即为了防止模型被提取等),您可以使用响应者gem中的verify_requested_format!
class UsersController < ApplicationController
respond_to :html
before_action :verify_requested_format!
def index
# ...
end
end
然后验证:
curl -v -H "Accept: image/*" localhost:9000/users
< HTTP/1.1 406 Not Acceptable
顺便提一下,您也可以使用respond_with
而不传递模型实例,例如:
class UsersController < ApplicationController
respond_to :html
def index
@users = User.all
respond_with
end
end
但据我所知,这似乎没有记录在案。