我正在运行RoR应用程序(rails 2.3.8,ruby 1.8.7),应用程序在我的本地计算机上运行正常。但在生产时,日志显示以下错误:
ActionView::TemplateError (Missing template folder/_file_name.erb in view path app/views) on line #19 of app/views/layouts/main.rhtml:
19: <%= render :partial => "folder/file_name" -%>
文件名存在为folder/_file_name.html.erb
,我试图在生产环境中重现问题,但没有任何运气,因为某些原因导轨应用程序在某些时候要求folder/_file_name.erb
,而在其他时候搜索对于正确的文件folder/_file_name.html.erb
。
有人可以向我解释发生了什么吗?
.rhtml文件,rails应用程序请求.erb有时也会出现同样的情况,而其他人则获得正确的.rhtml文件
更新
<%= render :partial => "shared/meta_tags" -%>
<%= render :partial => "shared/common_resources" -%>
<%= render :partial => 'shared/ads/oas' -%>
关于这个问题的任何指示都会有所帮助, 提前谢谢
答案 0 :(得分:5)
是否存在与该文件同名的控制器操作?
如果你的foo控制器有一个bar动作并且你的动作没有定义响应,Rails会尝试渲染view / foo / bar.html.erb。
如果那不是您想要的,您需要在控制器中定义一个响应并告诉Rails渲染适当的部分,如下所示:
respond_to do |format|
format.html do
render :partial => "/foo/bar"
end
end
在后一种情况下,Rails将呈现“views / foo / _bar.html.erb”
答案 1 :(得分:4)
请求的格式是什么?对于第一个模板(folder/_file_name.html.erb
),只有在请求格式为html时它才会正确,但如果它是ajax或您应用中的任何其他自定义类型则不会。如果你想对所有格式使用相同的部分,一个快速的解决方法是将其重命名为folder/_file_name.erb
答案 2 :(得分:3)
在某些情况下,由于存在缺少缓存,未知请求格式等负载原因,您无法阻止此错误
您可以尝试限制预定义格式的数量,例如:
get '/about-us' => 'controller#about', :format => /(?:|html|json)/
但是,我在application_controller.rb文件中添加了以下方法,以便此类错误将呈现404页面而非在屏幕上显示错误消息
rescue_from ActionView::MissingTemplate, :with => :rescue_not_found
protected
def rescue_not_found
Rails.logger.warn "Redirect to 404, Error: ActionView::MissingTemplate"
redirect_to '/404' #or your 404 page
end
你可以将这段代码包装在if语句中,比如这个if Rails.env.production?
,因为env已经设置好了你的开发环境不会受到影响