comment.user.name上的NoMethodError

时间:2014-12-14 08:10:08

标签: ruby-on-rails

编辑:未定义的方法`名称'为零:NilClass

我已经准备好了我的评论,但是当我显示评论用户名时,我得到了NoMethodError。当我用comment.user_id替换comment.user.name时,我得到了一个结果,那么这里发生了什么?

<% @comments.each do |comment| %>
    <div class="media">
        <div class"media-body"
            <h4 class="media-heading">
            <ul>
                <li><%= comment.body %> :by <%= comment.user.name> </li>
            </ul>
            </h4>
        </div>
    </div>
<% end %>

这是帖子和评论 class Post&lt;的ActiveRecord :: Base的     has_many:评论     belongs_to:用户     belongs_to:topic

default_scope { order('created_at DESC') }

    validates :title, length: {minimum: 5}, presence: true
    validates :body, length: {minimum: 20}, presence: true
    validates :topic, presence: true
    validates :user, presence: true

课程评论&lt;的ActiveRecord :: Base的   belongs_to:post   belongs_to:用户 端


在迁移中,当我在最近添加用户评论时,我添加了一个user_id列,认为我可以将id_s链接到名称,但我看看ROR guide如何关联用户和评论。

class CreateComments < ActiveRecord::Migration
  def change
    create_table :comments do |t|
      t.string :commenter
      t.text :body
      t.references :post

      t.timestamps
  end

     add_index :comments, :post_id
  end
end

它是这样的,但我不想要没有user_id评论的人,所以我必须让user_id以某种方式提取一个名字。


以下是用户和评论的模型

class User < ActiveRecord::Base
  # Include default devise modules. Others available are:
  # :confirmable, :lockable, :timeoutable and :omniauthable
  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :trackable, :validatable, :confirmable

  has_many :posts
  has_many :comment
    mount_uploader :avatar, AvatarUploader

 class Comment < ActiveRecord::Base
   belongs_to :post
   belongs_to :user
 end

2 个答案:

答案 0 :(得分:2)

  

未定义的方法`name&#39;为零:NilClass

这意味着没有为User模型的实例分配comment,所以:

  1. 确认已将User分配给Comment

  2. 确保您为user_id表创建了comment字段,并在belongs_to :user模型中声明了Comment

  3. 如果您不确定,请不要忘记迁移新架构,只需重新运行即可。

  4. 当您迁移后,验证 spec / dummy / db / schema.rb 已添加正确的列。

  5. 确保没有attr_accessor/reader :name,或者您没有明确定义#name模型的Comment方法。

  6. 如果您使用的是状态机,请确保没有:name事件。

  7. 在某些情况下,Rails不会重新加载模型,并且(据我所知)它永远不会重新加载数据库,强制重新加载Rails以确保模型,拾取模式,即杀死服务器,然后重新启动它。

  8. 要知道定义类#name的实例方法Comment的位置,请发出:

    Comment.instance_method(:name).source_location
    # => [".../gems/activerecord-~.~.~/lib/active_record/associations/builder/association.rb", ~~]
    

    有效档案相同: association.rb

  9. 还有一个原因,例如在播种时,当您将用户分配到评论时,您只需分配user_id,但是如果有#id的用户确实有&#39}。存在,访问评论如下:

    comment.user_id # => 5
    comment.user # => nil
    

    因此,当您分配#id而不是User记录时,您必须解决问题。

答案 1 :(得分:0)

您必须添加模型之间的关联。如果我没错的话,你似乎错过了它。您在comments表中有user_id列,但也应在模型中设置关联

评论模型

class Comment < ActiveRecord::Base
  belongs_to :user
end

此外,如果您想从用户模型中获取评论,请添加以下代码。

用户模型

class User < ActiveRecord::Base
  has_many :comment
end

希望它有所帮助。