对于我的一个项目,我偶尔得到这个例外:
ActionView :: MissingTemplate:缺少模板博客/索引{:handlers => [:rxml,:erb,:builder,:rjs,:haml,:rhtml],:formats => [“image / jpeg “,”image / pjpeg“,”image / png“,”image / gif“],:locale => [:en,:en]}在视图路径中”/ var / www / keeponposting / releases / 20110403083651 / app /意见“
似乎有人要求的图片来自不是图片的网址:
HTTP_ACCEPT“image / jpeg,image / pjpeg,image / png,image / gif”
有什么想法可以做些什么吗?我是否必须为其中一个实现处理程序并返回“”以消除此异常,或者是否有更好的方法来处理它?</ p>
现在我也得到了这个:
ActionView :: MissingTemplate:缺少模板博客/索引{:formats =&gt; [“text / *”],:handlers =&gt; [:rjs,:haml,:rhtml,:erb,:rxml,:构建器],:locale =&gt; [:en,:en]}在视图路径“/ var / www / keeponposting / releases / 20110415040109 / app / views”
无论请求的格式是什么,都没有办法发回HTML?
答案 0 :(得分:13)
我同意阻止有问题的机器人,但是如果你真的想强制使用响应格式,请添加before_filter
并设置request.format = :html
,如下所示:
before_filter :force_request_format_to_html
private
def force_request_format_to_html
request.format = :html
end
答案 1 :(得分:8)
我使用这个新的Rails 3.1选项解决了这个问题(几分钟前 - 到目前为止,这么好):
config.action_dispatch.ignore_accept_header = true
如this Rails issue中所述。这是config/application.rb
。
我在RSpec请求测试(使用Capybara)中测试了它:
it "should not break with HTTP_ACCEPT image/*;w=320;h=420 from iPhone" do
page.driver.header "Accept", "image/*;w=320;h=420"
visit "/some/path"
page.should have_content("Some content")
end
答案 2 :(得分:6)
这是一个更严格的回应; purp的建议,来自issue 4127的讨论。
class FooController
rescue_from ActionView::MissingTemplate, :with => :missing_template
def missing_template
render :nothing => true, :status => 406
end
end
答案 3 :(得分:5)
我很想在应用程序控制器中解救MissingTemplate并记录Referrer标头以查看触发此请求的内容。你永远不知道,它可能是你自己的应用程序的一些不起眼的部分!
另一方面,如果您确信这是由机器人引起的,您是否考虑过将违规网址添加到robots.txt文件中?例如:
User-Agent: YandexImages
Disallow: /your/failed/path
用机器人绊倒的路径替换“你的/失败/路径”。如果机器人在整个地方挣扎,你可能只是不允许访问该特定机器人的整个站点:
User-Agent: YandexImages
Disallow: /
我认为这比实现专门用于抑制看似行为不当的机器人的错误的处理程序更清晰,更轻松。
答案 4 :(得分:0)
我这样做了: 在我的控制器中,我放了一个前过滤器:
def acceptable_mime_type
unless request.accepts.detect{|a| a == :json || a == :html} || request.accepts.include?(nil)
if request.accepts.detect{|a| a.to_s().include?("*/*")}
ActionDispatch::Request.ignore_accept_header = true
else
render text: "Unacceptable", status: 406
false
end
end
end
它检查我支持的类型(例如json,html)和nil(nil呈现默认html),然后如果不支持这些mime类型,它会检查标题中的“ / ” 。如果找到它,我强制rails通过忽略accept标头来呈现默认的mime类型。
要在rspec中测试这个,我必须这样做:
describe 'bad header' do
describe 'accept' do
let(:mimeTypes) { ["application/text, application/octet-stream"] }
it 'should return a 406 status code' do
request.accept = mimeTypes
get 'index'
expect(response.response_code).to eq 406
end
describe 'with */* included' do
it 'should return a 200 status code' do
request.accept = ["*/*"] + mimeTypes
get 'index'
expect(response.response_code).to eq 200
end
end
end
end
出于某种原因,我在尝试使用here描述的方法在rspec中正确发送接受标头时遇到问题,但我发现如果我将request.accept设置为一个数组,我的测试都通过了。很奇怪,我知道,但我现在正在继续讨论下一期。
答案 5 :(得分:0)
将formats: [:html]
添加到渲染:
def action
render formats: [:html]
end