Rails 4:将属性插入Params

时间:2013-05-13 20:27:27

标签: ruby-on-rails strong-parameters

在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忽略了这个插入。它没有抛出任何错误,它只是悄然失败。

4 个答案:

答案 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