【问题标题】:Rails 4 connect nested resource with unnested resourcesRails 4 将嵌套资源与非嵌套资源连接起来
【发布时间】:2013-11-06 22:02:02
【问题描述】:

我有一个包含用户(Devise、Rolify、Cancan)、Recipes 和 cmets 的网站。

我的路线是这样的:

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 操作中呈现cmets 和cmets 表单。问题是在渲染之前,在 _comment.html.erb 部分,当我写的时候:

<%= comment.user.name %>

我得到了 nil:NilClass 错误的未定义方法 `name'。

无论如何,我可以显示

<% 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追到最后,没有解释嵌套资源与非嵌套资源的关系,也没有解释编辑和删除cmets。

谢谢。

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

    • 我的 User 类确实有一个 :name。 它运行良好。谢谢。我可以提出问题的第二部分吗?如果comment.user.avatar,您将如何使用 我刚刚尝试了 try 选项 并且,当用户没有头像时,它确实创建了 nill 类。有更好的方法吗?您知道路线上的完整示例应用程序吗?再次感谢。再次感谢,你在一分钟内解决了我花了几个小时的问题......
    • 我认为你正在做的是&lt;%= comment.user.avatar.blank? %&gt;blank 所做的是检查对象是否为空白,并且还可以通过仅包含空格来评估非空字符串。
    • 也许我在另一个地方做错了什么,因为 无论有没有空白都是空的?这与我在 comment.user.name 中遇到的问题相同,只是它们并不真正相关。
    • 最奇怪的想法是它在早上工作。他们都在工作的comment.user.name 和comment.user.avatar。但后来我更改了 cmets_controller 并开始出现问题。
    【解决方案2】:

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

    正确的做法是,使用或不使用脚手架生成第一个资源。然后忘记脚手架并创建第二个模型,下一个:关联资源,然后创建第二个模型控制器。这样,连接从一开始就是正确的,并且在“recipes/show”中,渲染 cmets 和用户列将像

    一样简单

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-02
      • 2016-11-03
      • 1970-01-01
      相关资源
      最近更新 更多