Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/visual-studio/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails Rails 4:将属性插入参数_Ruby On Rails_Strong Parameters - Fatal编程技术网

Ruby on rails Rails 4:将属性插入参数

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正在忽略此插入。它不会抛出任何错误,只是

在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正在忽略此插入。它不会抛出任何错误,只是悄悄地失败了。

找到了答案。您可以通过合并将属性插入到参数定义中,而不是从控制器操作中插入属性。要扩展我前面的示例,请执行以下操作:

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构造函数中使用的marflar
deep\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
,正如他们在所选答案的评论中所讨论的那样。