在Rails 3中,可以将属性插入到params中,如下所示:
params[:post][:user_id] = current_user.id
我试图在Rails 4中做类似的事情,但没有运气:
post_params[:user_id] = current_user.id
. . . .
private
def post_params
params.require(:post).permit(:user_id)
end
Rails忽略了这个插入。它没有抛出任何错误,它只是悄然失败。
答案 0 :(得分:133)
找到答案here。您可以使用合并将其插入到params定义中,而不是从控制器操作中插入属性。扩展我之前的例子:
private
def post_params
params.require(:post).permit(:some_attribute).merge(user_id: current_user.id)
end
答案 1 :(得分:35)
除了@ timothycommoner的答案之外,您还可以基于每个操作执行合并:
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
答案 2 :(得分:3)
作为此案例的替代方案,您可以通过scope
current_user.posts.create(post_params)
答案 3 :(得分:0)
如果有人试图弄清楚如何在Rails 5属性哈希中添加/编辑嵌套属性,我发现这是最简单的方法。不要为merge或deep_merge烦恼...由于参数强大,这很痛苦。在此示例中,我需要在保存之前将group_id和vendor_id复制到关联的发票(嵌套参数)。
def create
my_params = order_params
@order = Order.new
@order.attributes = my_params
@order.invoice.group_id = my_params[:group_id]
@order.invoice.vendor_id = my_params[:vendor_id]
@order.save
end
private
# Permit like normal
def order_params
params.require(:order).permit([:vendor_id, :group_id, :amount, :shipping,:invoice_attributes => [:invoice_number, :invoice_date, :due_date, :vendor_id, :group_id]])
end