使用多态可注释访问视图中的用户属性(姓名、头像等)

Accessing user attributes (name, avatar, etc) in view with polymorphic commentable

所以一个多态关系,对文章和newsitems有评论,每条评论也属于一个用户。到目前为止,我已经让它工作了,而且在视图中,这适用于为每个发布的评论打印出 user_id:

<% @comments.each do |comment| %>
  <div>
    <%= comment.updated_at.strftime("%b %d %Y, %H:%M") %></strong>
  </div>

  <div>
  <%= comment.user_id %>
  </div>

  <div>
  <%= comment.comment %>
  </div>
<% end %>

但显然我需要添加 username/avatar/etc,而不是 ID。我如何访问这些值?

更新:遵循 mudasobwa 的回答。

型号:

class User < ActiveRecord::Base
has_many :comments

# Include default devise modules. Others available are:
# :confirmable, :lockable, :timeoutable and :omniauthable
devise :database_authenticatable, :registerable,
     :recoverable, :rememberable, :trackable, :validatable
end

…and…

class Comment < ActiveRecord::Base
  belongs_to :commentable, polymorphic: true
  belongs_to :user
end

<%= comment.user.email %> 添加到视图之后生成:

undefined method `email' for nil:NilClass

更新 2:在视图中,它打印了它应该打印的内容:

<%= comment.user_id %> | <%= comment.commentable_id %> | <%= comment.commentable_type %>

通过多态关联检索时,使用关联名称获取关联对象,例如:

comment.commentable

Rails 将根据 commentable_type:

自动实例化 class
comment.commentable.class # => User 

comment.user comment.user.email等。工作,正如 zetetic 在对他的回答的评论中所建议的那样。这是零 returns。我在更改模型之前创建了其他评论的页面上对其进行了测试,因此它们没有为评论分配用户属性,因此 Rails 返回 nil,导致混乱。删除这些评论并发布新评论现在可以在文章页面上的评论旁边正确显示用户的电子邮件和用户名。感谢您的帮助。