Rails 4使用unnested资源连接嵌套资源

时间:2013-11-06 22:02:03

标签: ruby ruby-on-rails-4 nested-resources

我有一个包含用户(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

我正在食谱展示动作中呈现评论和评论表格。问题出在渲染之前,在_comment.html.erb部分,当我写:

<%= comment.user.name %>

我为nil得到了未定义的方法`name':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) %>

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

感谢。

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

现在我知道问题是什么了。当我第一次创建Comment模型时,在Recipe模型之后,当然,我使用了rails scaffolld,它为我生成了一个完整的控制器,其中new和edit方法各有自己的动作视图。我之前做过这件事来关联routes.rb中的资源。所以,我的联系很乱。因此,在关联模型时,脚手架是BAD IDEA。

正确的方法是,使用或不使用脚手架生成第一个资源。然后忘记scaffold并创建第二个MODEL,下一个:关联资源,然后创建第二个模型控制器。这样,连接将从开始就是严格的,当在“recipes / show”中时,呈现注释和用户列将像&lt;%= comment.user.name%&gt;

一样简单 无论如何,大卫,谢谢。我擅长教学。