我希望将用户电子邮件显示为评论的作者,但我看到此错误"未定义的方法`email'为零:NilClass" 的 comment.rb
class Comment < ActiveRecord::Base
belongs_to :hotel
belongs_to :user
end
user.rb
class User < ActiveRecord::Base
has_many :hotels
has_many :comments
end
hotel.rb
class Hotel < ActiveRecord::Base
belongs_to :user
belongs_to :address
has_many :comments
mount_uploader :avatar, AvatarUploader
accepts_nested_attributes_for :address
end
comments_controller.rb
def create
@hotel = Hotel.find(params[:hotel_id])
@comment = @hotel.comments.new(comment_params)
@comment.user_id = current_user.id
@comment.save
redirect_to @hotel
end
private
def comment_params
params.require(:comment).permit(:user_id, :body, :hotel_id)
end
_comments.html.haml
= div_for comment do
%p
%strong
Posted #{time_ago_in_words(comment.created_at)} ago
%br/
= h comment.user.email
%br
= comment.body
答案 0 :(得分:3)
方式强>
您正在调用不存在的方法的错误。
问题是你在一个不存在的关联对象上调用一个方法。您可能没有与user
关联的任何comment
- 从而阻止您调用email
方法。
首先,您需要确保拥有正确的关联。以下是如何做到这一点:
$ rails c
$ comment = Comment.find([id])
$ comment.update(user_id: [your_user_id])
$ exit
这将允许您将评论与特定用户相关联,使您能够调用关联的方法。
-
<强>控制器强>
当您将comment
保存在控制器中时,需要将user
分配给它。我们使用strong_params
功能执行此操作,因为它是我们找到的DRYest方式:
#app/controllers/comments_controller.rb
Class CommentsController < ApplicationController
def create
@comment = Comment.new(comment_params)
end
private
def comment_params
params.require(:comment).permit(:your, :comment: attributes).merge(user_id: current_user.id)
end
end
这将允许您在保存时关联用户,使您能够在下次呼叫记录时调用所需的方法!
<强>代表强>
您还可以使用delegate
方法,例如:
#app/models/comment.rb
Class Comment < ActiveRecord::Base
belongs_to :user
belongs_to :hotel
delegate :email, to: :user, prefix: true #-> allows you to call `@comment.user_email`
end
这将解决law of Demeter问题(你的目标应该在你的电话中有一个“点”)