我有一个使用partials的rails应用程序,在开发过程中一切都很好但是在生产中我收到了错误
我们很抱歉,但出了点问题。
我们已收到有关此问题的通知,我们很快就会对其进行审核。
我查看了我的production.log文件,这是我收到的错误
ActionView :: Template :: Error(NilClass的未定义方法`model_name':Class):
以下是导致问题的行
<%= div_for blog do %>
这是什么导致该文件
<%= render :partial => 'blogs/blog', :locals => {:blog => @profile.blogs.last}%>
这是整个错误
ActionView::Template::Error (undefined method `model_name' for NilClass:Class):
1: <%= div_for blog do %>
2: <p>
3: <b>Title:</b>
4: <%= blog.title %>
app/views/blogs/_blog.html.erb:1:in
app/views/profiles/show.html.erb:22:in
关于如何解决此错误的任何想法?
答案 0 :(得分:2)
您实际上正在调用nil.last
,这会引发此类错误。
仅当 @profile
包含博客时,才使用条件呈现部分:
<%= render(:partial => 'blogs/blog', :locals => {:blog => @profile.blogs.last}) if @profile.blogs.present? %>
或者,我会做什么,使用部分。在您看来:
<%= blogs_or_message %>
部分:
def blogs_or_message
if @profile.blogs.present?
render(:partial => 'blogs/blog', :locals => {:blog => @profile.blogs.last})
else
"No blogs found" # <= simple error message instead of nothing
end
end
答案 1 :(得分:1)
如果blog
为nil
,我猜测Rails不聪明并且跳过DIV。以下是一些可能的解决方法:
如果你真的只想渲染一个博客:
<% div_for(@profile.blogs.last) do %>
...whatever...
<% end if @profile.blogs.last %>
或者,如果你想为每个博客提供DIV,你不应该需要条件,因为@profile.blogs
会给你一个空数组,而Rails知道如何处理它:
<% div_for(@profile.blogs) do %>
...whatever...
<% end %>
希望有所帮助!