3

我尝试了其他几个类似的帖子,但仍然出现错误。

在 Posts 模型中,我有一个 category_id 字段。我有以下型号:

#Posts model
belongs_to :categories  

#Category model
has_many :posts

在 Posts 索引控制器中,我有:

@categories = @posts.Category.find(:all, :order => 'categoryname')

在视图中我有:

<% @posts.each do |post| %>
<tr>
<td><%= post.category_id %></td>
<td><%= @categories.categoryname %></td>

<td><%= link_to 'View', post %></td>
<td><%= link_to 'Edit', edit_post_path(post) %></td>
</tr>
<% end %>

在第二列中,我试图显示 Category 表中的类别名称(“categoryname”),而不是帖子表中的 category_id。我收到一个错误:

#ActiveRecord::Relation:0x3e1a9b0> 的未定义方法“类别”

我也试过:

<td><%= post.categories.categoryname %></td>

但得到同样的错误。

也:

<td><%= post.category.categoryname %></td>

任何建议将不胜感激。

4

5 回答 5

11

在你的模型中

belongs_to :category

在你看来

<td><%= post.category.categoryname %></td>

您可以摆脱@categories =控制器中的线路

此外,categoryname 可能不是您的 Category 模型的最佳属性名称。为什么不直接命名呢namepost.category.name看起来好多了post.category.categoryname,你不觉得吗?

于 2012-05-26T00:27:16.083 回答
4

好的,有几件事

belongs_to :categories  

belongs_to 是一个奇异的关系。你应该把

belongs_to :category 

在这种情况下,您需要 posts 表中的 category_id。你会得到类别

@post.category.categoryname

除非一个帖子可以有很多类别,在这种情况下你会想要

#Post
has_and_belongs_to_many :categories

#Category
has_and_belongs_to_many :posts

在这种情况下,您需要一个categories_posts带有两个字段的连接表category_idpost_id您可以通过调用

@post.categories.each do |cat|
  cat.categoryname
end

您的代码还有其他一些问题,例如

@categories = @posts.Category.find(:all, :order => 'categoryname')

类别是一个模型,而不是您的命名关系,这可能就是您在应用程序中遇到异常的原因。

于 2012-05-26T00:27:52.883 回答
2

您将收到以下错误

未定义方法 `categoryname' for nil:NilClass on the line: <%= post.category.categoryname %>

如果您的表中有没有指定类别的记录。

换句话说,确保您的所有记录都有一个与之关联的类别

于 2017-05-30T09:09:49.880 回答
0

我注意到控制器中的 @category 以小写字母 c 开头,但在您看来,它以大写字母开头!

于 2013-10-02T07:46:01.633 回答
0

在您的情况下,如果您有可能在帖子表中有一个空的 category_id (正如您在评论中提到的那样),您可以添加

if post.category_id?

所以你的单元格看起来像这样:

<td><%= post.category.categoryname if post.category_id? %></td>

如果 post.category_id 为 null 它只会显示一个空单元格。

于 2016-11-23T14:35:31.513 回答