为了账号安全,请及时绑定邮箱和手机立即绑定

Rails 4-强参数-嵌套对象

/ 猿问

Rails 4-强参数-嵌套对象

Cats萌萌 2019-09-21 13:50:46

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


因此,这是我发送到服务器的JSON字符串:


{

  "name" : "abc",

  "groundtruth" : {

    "type" : "Point",

    "coordinates" : [ 2.4, 6 ]

  }

}

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


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

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


如果我刚设置:


params.require(:measurement).permit!

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


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


查看完整描述

3 回答

?
123456qqq

当您想允许嵌套属性时,您确实在数组中指定了嵌套对象的属性。在你的情况下


按照@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


为了进一步澄清,您可以查看permit及其strong_parameters本身的实现:https : //github.com/rails/rails/blob/master/actionpack/lib/action_controller/metal/strong_parameters.rb#L246-L247


查看完整回答
反对 回复 2019-09-21
?
缥缈止盈

我发现此建议对我的情况有用:


  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


查看完整回答
反对 回复 2019-09-21
?
慕婉清6462132

允许嵌套对象:


params.permit( {:school => [:id , :name]}, 

               {:student => [:id, 

                            :name, 

                            :address, 

                            :city]},

                {:records => [:marks, :subject]})


查看完整回答
反对 回复 2019-09-21
  • 3 回答
  • 0 关注
  • 82 浏览
我要回答

相关问题推荐

添加回答

回复

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信