评论作者。轨道

时间:2014-07-06 11:45:49

标签: ruby-on-rails ruby

我希望将用户电子邮件显示为评论的作者,但我看到此错误"未定义的方法`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

1 个答案:

答案 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问题(你的目标应该在你的电话中有一个“点”)