我有五个模特:
class User < ActiveRecord::Base
has_many :administrations
has_many :calendars, through: :administrations
has_many :comments
end
class Calendar < ActiveRecord::Base
has_many :administrations
has_many :users, through: :administrations
has_many :posts
end
class Administration < ActiveRecord::Base
belongs_to :user
belongs_to :calendar
end
class Post < ActiveRecord::Base
belongs_to :calendar
end
class Comment < ActiveRecord::Base
belongs_to :post
belongs_to :user
end
comment
表格包含以下列:id
,post_id
,user_id
和body
。
在不同的视图中,例如在show.html.erb
帖子视图中,我需要使用发布user
的{{1}}的第一个名称显示相关评论。
换句话说,我正在尝试从comment
检索user.first_name
。
为实现这一目标,我在comment.user_id
文件中定义了以下方法:
comment.rb
然后我更新了def self.user_first_name
User.find(id: '#{comment.user_id}').first_name
end
帖子视图,如下所示:
show.html.erb
当我这样做时,我收到以下错误:
<h3>Comments</h3>
<% @post.comments.each do |comment| %>
<p>
<strong><%= comment.user_first_name %></strong>
<%= comment.body %>
</p>
<% end %>
我真的不明白为什么我收到与NoMethodError in Posts#show
undefined method `user_first_name' for #<Comment:0x007fc510b67380>
<% @post.comments.each do |comment| %>
<p>
<strong><%= comment.user_first_name %></strong>
<%= comment.body %>
</p>
<% end %>
相关的错误。
知道如何解决这个问题吗?
答案 0 :(得分:2)
替换:
<强> comment.rb 强>
def self.user_first_name
User.find(id: '#{comment.user_id}').first_name
end
使用:
<强> comment.rb 强>
delegate :first_name, to: :user, prefix: true
如果你这样做,你可以拨打同一个电话comment.user_first_name
,它会给你用户的名字。如果您不希望它在用户没有first_name时中断,请添加, allow_nil: true
。
您可能还想添加:
has_many :comments
<强> user.rb 强>
class User < ActiveRecord::Base
has_many :administrations
has_many :calendars, through: :administrations
has_many :comments
end