Rails 4强烈的params混乱

时间:2014-05-06 19:16:52

标签: ruby-on-rails ruby ruby-on-rails-4 strong-parameters

我正在尝试在Rails 4.1中使用强大的参数并且努力失败。

# Some request params
params = ActionController::Parameters.new({
  order: {
    shipping_method: '03',
    line_items_attributes: [{
      sale_id: "12847",
      qty: "12"
    }]
  }
})

# try to permit them all
params.permit(:order).permit(
  :shipping_method,
  {
    line_item_attributes: [
      :sale_id,
      :qty,
    ]
  }
)

# Unpermitted parameters: order
# => {}

我希望能够允许所有这些参数。

为什么我会收到警告,为什么我会将空哈希作为返回值?


似乎require更有帮助,但我仍然无法获得嵌套的哈希数组

params.require(:order).permit(
  :shipping_method,
  {
    line_item_attributes: [
      :sale_id,
      :qty,
    ]
  }
)

# Unpermitted parameters: line_items_attributes
# => {"shipping_method"=>"03"}

2 个答案:

答案 0 :(得分:2)

应该是params.require(:order)而不是params.permit(:order)

Rails Docs : Action Controller Parameters

中查看此内容

您的代码应如下所示:

params = ActionController::Parameters.new({
  order: {
    shipping_method: '03',
    line_items_attributes: [{
      sale_id: "12847",
      qty: "12"
    }]
  }
})

之后

params.require(:order).permit(
  :shipping_method,
  {
    line_items_attributes: [
      :sale_id,
      :qty,
    ]
  }
)

注意:您需要允许line_items_attributes(注意复数项)而不是line_item_attributes(不是单数项)。 (假设您1-M associationOrder之间有LineItem

答案 1 :(得分:0)

您的问题与定义接受参数时调用permit两次这一事实有关。强参数的工作方式是您必须require与您尝试构建的对象相对应的参数(在您的情况下为:order)。然后,您可以通过调用permit来链接此方法,该params.require(:order).permit(:shipping_method, :line_items_attributes,...) 接受与您希望为对象接受的参数对应的逗号分隔的参数列表:

permit

如果您希望接受嵌套参数,则必须在params.require(:order).permit(:shipping_method, line_items_attributes: [:sale_id, :qty]) 方法中将它们指定为数组:

{{1}}

查看full documentation了解详情。