我正在使用rails_best_practices来提取我的代码。
评论属于post,属于用户。
我的comments_controller.rb
文件看起来像这样
class CommentsController < ApplicationController
before_action :find_post
def create
@comment = @post.comments.create comment_params
@comment.user_id = current_user.id
redirect_to @post if @comment.save
end
private
def find_post
@post = Post.find(params[:post_id])
end
def comment_params
params.require(:comment).permit(:post_id, :body)
end
end
我收到此错误use model association (for @comment)
。
重构后,我的create方法看起来像这样
def create
@comment = @post.comments.create(
comment_params.merge(user_id: current_user.id)
)
redirect_to @post if @comment.save
end
我的问题是:这是最好和最正确的方法是什么?
答案 0 :(得分:1)
通常情况下,我建议在控制器特定的_params
函数内烘焙任何必需的参数。也就是说,这样做:
def comment_params
params.require(:comment).permit(:post_id, :body).merge(
user: current_user
)
end
然后,当它进入你的控制器动作时,你会非常高兴。
我倾向于使用build
方法为new
和create
构建正确的对象:
def build_comment
@comment = @post.comments.build(comment_params)
end
现在,如果你放松了require
对params的限制,这将正确填充,但是由你决定如何灵活。我发现这一直在为多个编辑轮次填充和准备相同的对象,以及需要设置一些默认值的第一轮。