User_id未传递给辅助控制器

时间:2017-09-10 08:20:53

标签: ruby-on-rails bcrypt controllers

我正在Rails中构建一个相当基本的应用程序,使用两个主要控制器,用户和注释。我正在使用Bcrypt并且具有用于用户加密的secure_password和嵌套资源,因此用户has_many评论和评论belongs_to user。

当我尝试保存新评论时,我收到的错误消息如下:注释的未知属性“user_id”。似乎user_id没有传递给控制器​​,虽然这应该使用评论控制器中定义的current_user来完成 - 目前看起来像这样:

def new
    @user = current_user
    @comment = Comment.new
    @comment.save
end

def create
    @user = current_user
    @comment = @user.comments.new(comment_params)
    @comment.save
    redirect_to user_comments_path, notice: "Thank you for your comment!"
end

...

private
def comment_params
    params.require(:comment).permit(:user_id, :location, :title, :body)
end

当我尝试保存我登录的评论时,所以我不确定为什么user_id不会传递给控制器​​。我非常感谢你的建议,谢谢。

1 个答案:

答案 0 :(得分:0)

  

当我尝试保存新评论时,我收到的错误消息是   以下内容:“注释的未知属性'user_id'。

使用belongs_to关联关联时,您必须实际向表中添加列以存储外键。

您可以使用以下命令生成迁移:

rails g migration add_user_id_to_comments user:belongs_to

然后使用rails db:migrate进行迁移。

你的控制器也有很多问题:

def new
  @comment = current_user.comments.new
  # never save in new method!
end

def create
  @comment = current_user.comments.new(comment_params)
  # you always have to check if save/update was successful
  if comment.save
    redirect_to user_comments_path, notice: "Thank you for your comment!"
  else
    render :new
  end
end

没有必要将current_user保存到单独的实例变量中,因为您应该记住它。

def current_user
  @current_user ||= session[:user_id] ? User.find(session[:user_id]) : nil
end