ActionView :: TemplateError(缺少模板)在ruby on rails上

时间:2011-02-24 09:47:27

标签: ruby-on-rails ruby rendering actionview

我正在运行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' -%>

关于这个问题的任何指示都会有所帮助, 提前谢谢

3 个答案:

答案 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已经设置好了你的开发环境不会受到影响