Rails 4 - 强参数 - 嵌套对象

时间:2013-08-26 04:43:21

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

我有一个非常简单的问题。但到目前为止还没有找到解决方案。

所以这是我发送给服务器的JSON字符串:

{
  "name" : "abc",
  "groundtruth" : {
    "type" : "Point",
    "coordinates" : [ 2.4, 6 ]
  }
}

使用新的许可证方法,我得到了:

params.require(:measurement).permit(:name, :groundtruth)

这不会引发任何错误,但创建的数据库条目包含null而不是groundtruth值。

如果我只是设置:

params.require(:measurement).permit!

所有内容都按预期保存,但当然,这会破坏强参数提供的安全性。

我找到了解决方案,如何允许数组,但没有找到使用嵌套对象的单个示例。这必须是某种可能的,因为它应该是一个非常常见的用例。那么,它是如何运作的?

4 个答案:

答案 0 :(得分:167)

当您想要允许嵌套属性时,它会发出奇怪的声音,您可以在数组中指定嵌套对象的属性。在你的情况下,它将是

按照@RafaelOliveira

的建议

更新

params.require(:measurement)
      .permit(:name, :groundtruth => [:type, :coordinates => []])

另一方面,如果你想要嵌套多个对象,那么你将它包装在一个哈希中......就像这样

params.require(:foo).permit(:bar, {:baz => [:x, :y]})


Rails实际上有相当好的文档:http://api.rubyonrails.org/classes/ActionController/Parameters.html#method-i-permit

如需进一步说明,您可以查看permitstrong_parameters本身的实施情况:https://github.com/rails/rails/blob/master/actionpack/lib/action_controller/metal/strong_parameters.rb#L246-L247

答案 1 :(得分:21)

我发现这个建议在我的案例中很有用:

  def product_params
    params.require(:product).permit(:name).tap do |whitelisted|
      whitelisted[:data] = params[:product][:data]
    end
  end

查看Xavier对github的评论link

这种方法将整个参数[:measurement] [:groundtruth]对象列入白名单。

使用原始问题属性:

  def product_params
    params.require(:measurement).permit(:name, :groundtruth).tap do |whitelisted|
      whitelisted[:groundtruth] = params[:measurement][:groundtruth]
    end
  end

答案 2 :(得分:6)

允许嵌套对象:

{{1}}

答案 3 :(得分:0)

如果是Rails 5,则由于新的哈希符号: params.permit(:name, groundtruth: [:type, coordinates:[]])可以正常工作。