NoMethodError未定义的方法`name'代表nil:NilClass

Shu*_*vro 3 ruby-on-rails ruby-on-rails-4

我有两个模型的帖子和类别.我正试图在我的索引和展示视图中显示每个帖子的类别名称.我正在使用表连接.但问题是,在我的show视图中,类别正确显示,但它在索引视图中为nil:NilClass提供NoMethodError:undefined方法`name'.我无法弄清楚为什么它会在我的节目视图中显示而不是在索引视图中显示.

index.html.erb

<% @posts.each do |post| %>
  <h2><%= link_to post.title, post %></h2>
  <p>?????? <%= post.category.name %></p>
  <p><%= post.body %></p>
  <%= link_to '?????', post, class: "button tiny" %>&nbsp;
  <%= link_to '????????', edit_post_path(post), class: "button tiny" %>
<% end %>
Run Code Online (Sandbox Code Playgroud)

show.html.erb

<h2><%= link_to @post.title, @post %></h2>
<h5>?????? <%= @post.category.name %></h5>
<p><%= @post.body %></p>
Run Code Online (Sandbox Code Playgroud)

post.rb

class Post < ActiveRecord::Base
  validates_presence_of :title, :body, :category
  has_many :comments
  belongs_to :category
end
Run Code Online (Sandbox Code Playgroud)

category.rb

class Category < ActiveRecord::Base
  has_many :posts
end
Run Code Online (Sandbox Code Playgroud)

zea*_*soi 11

您的@posts实例变量包含其实例Post,无论出于何种原因,它们都与父项无关Category.您可以NilClass通过在打印类别名称之前检查每个是否Post具有关联来避免错误Category:

<%= post.category.name if post.category %>
Run Code Online (Sandbox Code Playgroud)

或者,由于存在与a Post无关的a Category可能是不合需要的,因此您可能希望将整个块包装在检查以下内容的条件中Category:

<% @posts.each do |post| %>
  <% if post.category %> # Check for parent category
    # Remaining code
  <% end %>
<% end %>
Run Code Online (Sandbox Code Playgroud)