Ruby on rails Rails 4:将属性插入参数
在Rails 3中,可以像这样在参数中插入属性:Ruby on rails Rails 4:将属性插入参数,ruby-on-rails,strong-parameters,Ruby On Rails,Strong Parameters,在Rails 3中,可以像这样在参数中插入属性: 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正在忽略此插入。它不会抛出任何错误,只是
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正在忽略此插入。它不会抛出任何错误,只是悄悄地失败了。找到了答案。您可以通过合并将属性插入到参数定义中,而不是从控制器操作中插入属性。要扩展我前面的示例,请执行以下操作:
private
def post_params
params.require(:post).permit(:some_attribute).merge(user_id: current_user.id)
end
除了@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
作为这种情况的替代方案,您可以通过
作用域传递所需的属性:
current\u user.posts.create(post\u params)
如果有人想知道如何在Rails 5属性散列中添加/编辑嵌套属性,我发现这是最直接(可选)的方法。不要为合并或深度合并而烦恼……由于强大的参数,这是一种痛苦。在本例中,我需要在保存之前将组id和供应商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
@您在params构造函数中使用的marflardeep\u merge
?或者在你控制器的其他地方?我也是这样做的,但我一直在想一定有办法让它干涸一点。我所有的50+控制器在strict params区域都有一个类似的.merge语句。在我的例子中,我将当前用户合并到更新的用户中。我只在create方法中将当前用户合并到created用户中。@Dan,我想您使用的是关联,所以使用诸如:current\u user.items.create(item\u参数)
之类的东西应该更容易些。只有当我要创建另一个关联时,我才使用merge
,即@comment=@commentable.comments.new(comment\u params)
和我的comment\u params
方法如下所示:params.require(:comment.permit(:body,:parent\u id,:removed)。merge(user\u id:current\u user.id)
,请看看我的问题,如果可以的话,帮我解决。它与此密切相关:如果像我一样,你正在寻找如何在params中使用自定义值,你可以执行'params.require(:post.permit(:some_属性)。merge(user_id:params[:post][:id])嘿,你会如何为嵌套资源执行此操作?我不确定为什么@timothycommoner的答案对我不起作用。只有这一个。。。我甚至尝试了合并代码>仍然失败。哦,无论如何,这读起来更容易,因为在私有方法中没有挖掘,在不同的用途中更容易更改cases@Patient55我想你需要deep\u merge
,正如他们在所选答案的评论中所讨论的那样。