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
为了进一步说明,你可以看看permit
和strong_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]})