注释函数:nil的未定义方法`comment':NilClass

时间:2017-12-21 20:29:16

标签: ruby-on-rails ruby ruby-on-rails-3

我想为我的rails应用程序创建注释函数。因此,只有current_user或管理员(我使用active_admin)才能删除他的评论。但由于我的方法似乎指向nil,我很难弄明白。有人可以帮帮我吗?

comments_controller.rb

class CommentsController < ApplicationController
  before_action :correct_user,   only: :destroy

  def create 
    @post =Post.find(params[:post_id])
    @comment =@post.comments.create(params[:comment].permit(:name, :body))
    redirect_to post_path(@post)
  end

  def destroy 
    @post = Post.find(params[:post_id])
    @comment= @post.comments.find(params[:id])
    @comment.destroy
    redirect_to post_path(@post)
  end

  private
  def correct_user
    @user= User.find(current_user.id)
    redirect_to(root_url) unless current_user.id == @post.comment.user.id
  end

end

在我的correct_user方法中显示未定义的注释,所以我已经尝试添加

@post = Post.find(params[:post_id])    
@comment= @post.comments.find(params[:id])

并尝试了不同的方法来实现这一目标。

Comment.rb

class Comment < ApplicationRecord
  belongs_to :post
end

Post.rb

class Post < ApplicationRecord
  belongs_to :user
  has_many :comments, dependent: :destroy

  validates :title, presence: true, length: {minimum: 5}
  validates :body, presence: true
  validates :user, presence: true
  validates :user_id, presence: true
  has_attached_file :image  #, :styles => { :medium => "300x300>", :thumb => 
  "100x100>" }
  validates_attachment_content_type :image, :content_type => /\Aimage\/.*\Z/
end

User.rb

class User < ApplicationRecord
 has_many :posts

 devise :database_authenticatable, :registerable,
     :recoverable, :rememberable, :trackable, :validatable  
end

PS:我想用之前的动作做这个,然后在删除链接周围用if语句。

2 个答案:

答案 0 :(得分:1)

@post中的{p> #correct_usernil,因为它首先在#destroy内设置。此外,您的Comment模型目前与User模型没有关系,@post.comment.user.id将无效,因为#user也将不定义。

要解决此问题,请在CommentUser之间添加关系,仅在正确的用户呼叫@comment.destroy操作时调用destroy

答案 1 :(得分:0)

试试这个,

 def destroy 
    @comment.destroy
    redirect_to post_path(@post)
  end

  private
  def correct_user
    @comment = Comment.find(params[:id])
    @post = @comment.try(:post)
    redirect_to(root_url) unless current_user.id == @post.try(:user_id)
  end

params[:id]中,我们收到了评论的ID。此@comment.try(:post)@post.try(:user_id)只有在您的问题中提到关联时才有效。

Comment Model
belongs_to :post

Post Model
belongs_to :user