Rails 4 – 强大的参数 – 嵌套的对象

我有一个非常简单的问题。 但到目前为止还没有find解决办法。

所以这里是我发送给服务器的JSONstring:

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

使用新的许可证方法,我有:

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

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

如果我只是设置:

 params.require(:measurement).permit! 

一切都按预期得到保存,但当然,这会杀死强参数提供的安全性。

我已经find解决scheme,如何允许数组,但不是一个使用嵌套对象的例子。 这一定是可能的,因为它应该是一个很常见的用例。 那么它是怎样工作的?

听起来很奇怪,当你想要允许嵌套属性时,你可以指定数组中嵌套对象的属性。 在你的情况下,将是

根据@RafaelOliveirabuild议更新

 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

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

  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 

允许嵌套对象:

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