Rails 4: Insert Attribute Into Params
In Rails 3, it was possible to insert an attribute into params like so:
params[:post][:user_id] = current_user.id
I'm attempting to do something similar in Rails 4, but having no luck:
post_params[:user_id] = current_user.id
. . . .
private
def post_params
params.require(:post).permit(:user_id)
end
Rails is ignoring this insertion. It doesn't throw any errors, it just quietly fails.
Found the answer here. Rather than inserting the attribute from within the controller action, you can insert it into the params definition with a merge. To expand upon my previous example:
private
def post_params
params.require(:post).permit(:some_attribute).merge(user_id: current_user.id)
end
In addition to @timothycommoner's answer, you can alternatively perform the merge on a per-action basis:
def create
@post = Post.new(post_params.merge(user_id: current_user.id))
# save the object etc
end
private
def post_params
params.require(:post).permit(:some_attribute)
end
As an alternative for this case, you can required pass attribute via scope
:
current_user.posts.create(post_params)