Rails 3渲染部分错误

时间:2012-02-17 23:40:30

标签: ruby-on-rails ruby ruby-on-rails-3

我有一个使用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

关于如何解决此错误的任何想法?

2 个答案:

答案 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)

如果blognil,我猜测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 %>

希望有所帮助!