Rails 缺少模板错误,只是间歇性的
Rails missing template error, only intermittently
生产网站 Rails 4.2.1
一切正常,但主页偶尔会出现奇怪的错误:
Missing template home/index, application/index with {:locale=>[:en], :formats=>["text/html;text/plain"], :variants=>[], :handlers=>[:erb, :builder, :raw, :ruby, :coffee, :jbuilder]}. Searched in:
[...] /releases/20150619150924/app/views"
[...] shared/bundle/ruby/2.1.0/gems/devise-3.5.1/app/views"
显然 app/views/home/index.html.erb 存在并且大部分时间工作正常,但似乎偶尔会错过。不知道这里发生了什么,这怎么可能只是偶尔发生?我从来没有在登台或开发中得到这个。
请注意,每几百页浏览量只会发生一次。
我是不是漏掉了什么?不胜感激指点。
这个错误的原因是header不正确,你可以简单的通过curl请求重现:
curl -v -H "Accept: text/html;text/plain" http://your.domain
好像有人在写他的机器人时犯了错误。这个是正确的:
curl -v -H "Accept: text/html; q=0.2 text/plain" http://your.domain
这个也有效:
curl -v -H "Accept: text/html,text/plain" http://your.domain
RFC:http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.1
可以通过中间件修复:
# lib/fix_accept_header.rb
class FixAcceptHeader
def initialize(app)
@app = app
end
def call(env)
if env["HTTP_ACCEPT"] =~ %r(text/html;\s*text/plain)
env["HTTP_ACCEPT"] = "text/html, text/plain"
end
@app.call(env)
end
end
# config/application.rb
require File.expand_path('../../lib/fix_accept_header', __FILE__)
#...
class Application < Rails::Application
#...
config.middleware.use FixAcceptHeader
end
生产网站 Rails 4.2.1
一切正常,但主页偶尔会出现奇怪的错误:
Missing template home/index, application/index with {:locale=>[:en], :formats=>["text/html;text/plain"], :variants=>[], :handlers=>[:erb, :builder, :raw, :ruby, :coffee, :jbuilder]}. Searched in:
[...] /releases/20150619150924/app/views"
[...] shared/bundle/ruby/2.1.0/gems/devise-3.5.1/app/views"
显然 app/views/home/index.html.erb 存在并且大部分时间工作正常,但似乎偶尔会错过。不知道这里发生了什么,这怎么可能只是偶尔发生?我从来没有在登台或开发中得到这个。
请注意,每几百页浏览量只会发生一次。
我是不是漏掉了什么?不胜感激指点。
这个错误的原因是header不正确,你可以简单的通过curl请求重现:
curl -v -H "Accept: text/html;text/plain" http://your.domain
好像有人在写他的机器人时犯了错误。这个是正确的:
curl -v -H "Accept: text/html; q=0.2 text/plain" http://your.domain
这个也有效:
curl -v -H "Accept: text/html,text/plain" http://your.domain
RFC:http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.1
可以通过中间件修复:
# lib/fix_accept_header.rb
class FixAcceptHeader
def initialize(app)
@app = app
end
def call(env)
if env["HTTP_ACCEPT"] =~ %r(text/html;\s*text/plain)
env["HTTP_ACCEPT"] = "text/html, text/plain"
end
@app.call(env)
end
end
# config/application.rb
require File.expand_path('../../lib/fix_accept_header', __FILE__)
#...
class Application < Rails::Application
#...
config.middleware.use FixAcceptHeader
end