Rails中的注释功能。 nil的未定义方法`first_name':NilClass

时间:2014-01-08 11:50:14

标签: ruby-on-rails ruby

我永远无法做到的一件事就是实施评论功能。在我学会这样做之前,我不会离开我的电脑。

此行引发错误:

<strong><%= comment.user.first_name %></strong>

显然usernil;但为什么?我需要做些什么才能让它发挥作用?

评论应属于指南和用户。用户和指南都有很多评论。

我从

开始
rails g scaffold comment body:text guide:references user:references

然后迁移数据库。我也完成了模型协会。

这是我的指南控制器显示动作:

  def show
    @guide = Guide.find(params[:id])
    @comment = @guide.comments.build
  end

以下是Guide show视图中涉及评论的部分:

<h3>Comments</h3>

<% @guide.comments.each do |comment| %>
  <div>
    <strong><%= comment.user.first_name %></strong>
    <br />
    <p><%= comment.body %></p>
  </div>
<% end %>
<%= render 'comments/form' %>

以下是评论表格部分:

<%= simple_form_for(@comment) do |f| %>
  <%= f.error_notification %>

  <div class="form-inputs">
    <%= f.input :body %>
    <%= f.association :user %>
    <%= f.association :guide %>
  </div>

  <div class="form-actions">
    <%= f.button :submit %>
  </div>
<% end %>

User.rb

class User < ActiveRecord::Base
  # Include default devise modules. Others available are:
  # :confirmable, :lockable, :timeoutable and :omniauthable
  devise :database_authenticatable, :registerable, #:recoverable,
          :rememberable, :trackable, :validatable

  validates :first_name, presence: true
  validates :email, presence: true
  validates :email, uniqueness: true
  validates :runescape_username, presence: true

  has_many :guides
  has_many :comments

  acts_as_voter

  def user_score
    self.guides.inject(0) { |sum, guide| sum += guide.score }
  end
end

Comment.rb

class Comment < ActiveRecord::Base
  belongs_to :user
  belongs_to :guide
end

评论控制器创建动作:

  def create
    @comment = Comment.new(comment_params)

    respond_to do |format|
      if @comment.save
        format.html { redirect_to @comment, notice: 'Comment was successfully created.' }
        format.json { render action: 'show', status: :created, location: @comment }
      else
        format.html { render action: 'new' }
        format.json { render json: @comment.errors, status: :unprocessable_entity }
      end
    end
  end

2 个答案:

答案 0 :(得分:1)

替换

@comment = Comment.new(comment_params)

@comment = current_user.comments.build(comment_params)

Comments#create行动中。

您收到此错误是因为您未将current_user分配给已创建的Comment。这就是comment.user返回nil的原因。

如AndreDurao所述,您还可以在Comment模型中验证user_id状态,如下所示:

class Comment
  validates_presence_of :user
  # ...
end

答案 1 :(得分:0)

要摆脱该错误,请尝试此<%= comment.user.try(:first_name) %>