编辑:未定义的方法`名称'为零: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
答案 0 :(得分:2)
未定义的方法`name&#39;为零:NilClass
这意味着没有为User
模型的实例分配comment
,所以:
确认已将User
分配给Comment
确保您为user_id
表创建了comment
字段,并在belongs_to :user
模型中声明了Comment
。
如果您不确定,请不要忘记迁移新架构,只需重新运行即可。
当您迁移后,验证 spec / dummy / db / schema.rb 已添加正确的列。
确保没有attr_accessor/reader :name
,或者您没有明确定义#name
模型的Comment
方法。
如果您使用的是状态机,请确保没有:name
事件。
在某些情况下,Rails
不会重新加载模型,并且(据我所知)它永远不会重新加载数据库,强制重新加载Rails
以确保模型,拾取模式,即杀死服务器,然后重新启动它。
要知道定义类#name
的实例方法Comment
的位置,请发出:
Comment.instance_method(:name).source_location
# => [".../gems/activerecord-~.~.~/lib/active_record/associations/builder/association.rb", ~~]
有效档案相同: association.rb
还有一个原因,例如在播种时,当您将用户分配到评论时,您只需分配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
希望它有所帮助。