156

我有一个很简单的问题。但目前还没有找到解决办法。

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

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

使用新的 permit 方法,我得到:

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

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

如果我只是设置:

params.require(:measurement).permit!

一切都按预期保存,但是当然,这会破坏强参数提供的安全性。

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

4

4 回答 4

196

当您想要允许嵌套属性时听起来很奇怪,您确实在数组中指定了嵌套对象的属性。在你的情况下,它会是

按照@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_parametershttps: //github.com/rails/rails/blob/master/actionpack/lib/action_controller/metal/strong_parameters.rb#L246-L247

于 2013-08-26T05:59:35.847 回答
23

我发现这个建议对我来说很有用:

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

在 github 上查看Xavier 评论的链接。

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

使用原始问题属性:

  def product_params
    params.require(:measurement).permit(:name, :groundtruth).tap do |whitelisted|
      whitelisted[:groundtruth] = params[:measurement][:groundtruth]
    end
  end
于 2014-06-29T11:21:06.607 回答
10

允许嵌套对象:

params.permit( {:school => [:id , :name]}, 
               {:student => [:id, 
                            :name, 
                            :address, 
                            :city]},
                {:records => [:marks, :subject]})
于 2016-03-30T08:16:22.607 回答
1

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

于 2018-11-01T16:29:33.103 回答