0

我有一个包含用户(Devise、Rolify、Cancan)、食谱和食谱评论的网站。

我的路线是这样的:

resources :users

resources :recipes do
   resources :comments
end

我的模型是:

class User < ActiveRecord::Base
has_many :recipes
has_many :comments

class Recipe < ActiveRecord::Base
belongs_to :user
has_many :comments

class Comment < ActiveRecord::Base
belongs_to :recipes
belongs_to :user

我正在Recipes Show 操作中呈现评论和评论表单。问题是在渲染之前,在 _comment.html.erb 部分,当我写:

<%= comment.user.name %>

我得到了 nil:NilClass 错误的未定义方法“名称”。

无论如何,我可以显示

<% comment.user_id %>

如何检索用户名?

我试过了:

<%= User.find(comment.user_id).name %>
<%= @comment.user.name %>
<%= comment.user_id.find(:name) %>
<%= comment.user_id.get(:name) %>
<%= comment.user_id(:name) %>

有人知道有关路由的完整教程吗?在这里我可以找到所有的理论,但对于初学者来说,解释上有很多漏洞。这里我一直跟进到最后,但没有解释嵌套资源与非嵌套资源的关系,也没有解释编辑和删除评论。

谢谢。

4

2 回答 2

0

现在我知道问题出在哪里了。当我第一次创建 Comments 模型时,当然,在 Recipe 模型之后,我使用了 rails scaffoldd,它为我生成了一个完整的控制器,其中 new 和 edit 方法都有自己的动作视图。我之前这样做是为了关联 routes.rb 中的资源。所以,我的关系一团糟。因此,在关联模型时,脚手架是 BAD IDEA。

正确的做法是,使用或不使用脚手架生成第一个资源。然后忘记脚手架并创建第二个模型,下一个:关联资源,然后创建第二个模型控制器。这样,连接从一开始就是正确的,当在“recipes/show”中时,呈现评论和用户列将像 <%= comment.user.name %> 一样简单

无论如何,谢谢,大卫。我很欣赏教学。

于 2013-11-07T00:59:59.137 回答
0

您得到的错误undefined method name' for nil:NilClass error.意味着您正在nameNilClass 上设置一个方法。NilClass 是 Ruby 中的一个实际类。然而这是错误的。您想在类User右侧设置方法名称。因此,随着您的关联设置正确,您应该能够执行以下操作<%= comment.user.try(:name) %>。try 的目的是允许你在对象上调用方法而不是 nil,这意味着如果对象为空,它不会抛出错误,而是返回 Nil。

于 2013-11-06T22:16:12.120 回答