69

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

4

4 回答 4

146

在这里找到了答案。您可以通过合并将其插入到 params 定义中,而不是从控制器操作中插入属性。扩展我之前的示例:

private

  def post_params
    params.require(:post).permit(:some_attribute).merge(user_id: current_user.id)
  end
于 2013-05-13T22:12:16.527 回答
39

除了@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
于 2014-06-13T16:57:20.700 回答
3

作为这种情况的替代方案,您可以通过以下方式要求传递属性scope

current_user.posts.create(post_params)

于 2016-07-12T10:29:08.650 回答
1

如果有人试图弄清楚如何在 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
于 2019-05-27T19:44:56.880 回答