Rails 4 - 强参数 - 嵌套对象

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

下面是我发送给服务器的 JSON 字符串:

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

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

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

虽然没有出错,但创建的数据库条目中包含了null,而不是 groundtruth 值。

如果我只设置

params.require(:measurement).permit!

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

我找到了允许使用数组的解决方案,但没有一个使用嵌套对象的例子。这肯定是有可能的,因为这应该是很常见的用例。那么,它是如何工作的呢?

解决办法

虽然听起来很奇怪,但当你想允许嵌套属性时,你就必须在数组中指定嵌套对象的属性。在你的例子中,应该是

更新,正如 @RafaelOliveira 所建议的那样

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

另一方面,如果您想嵌套多个对象,则可以将其封装在散列中......如下所示

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

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

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

查看 Xavier'github 上的评论 链接

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

使用原始问题属性:

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

允许嵌套对象 :

params.permit( {:school => [:id , :name]}, 
               {:student => [:id, 
                            :name, 
                            :address, 
                            :city]},
                {:records => [:marks, :subject]})
评论(0)