ruby-on-rails rails开发 - Rails 4-强大的参数-嵌套对象




view教程 rails教程 (4)

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

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

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

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

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

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

如果我只是设置:

params.require(:measurement).permit!

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

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


Answers

允许嵌套对象:

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

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

根据@RafaelOliveira建议更新

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

另一方面,如果你想嵌套多个对象,那么你把它包裹在一个哈希里面......就像这样

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


实际上,Rails在这方面有很好的文档: api.rubyonrails.org/classes/ActionController/… : api.rubyonrails.org/classes/ActionController/…

为了进一步说明,你可以看看permitstrong_parameters本身的实现: github.com/rails/rails/blob/master/actionpack/lib/…github.com/rails/rails/blob/master/actionpack/lib/…


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

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

查看Xavier对github的评论link

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

使用原始问题属性:

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

这样做不是一个好主意:

self.class.update_all({ pagehit: pagehit+1 }, { id: id })

它应该是

self.class.update_all("pagehit = pagehit + 1", { id: id })

原因是如果两个请求是并行的,则在第一个版本上,两个请求都将使用相同的数字更新pagehits,因为它使用保存在Ruby内存中的数字。 第二个选项使用sql server将数字增加1,如果其中两个查询同时出现,服务器将一个接一个地处理它们,并最终得到正确的分页数。





ruby-on-rails ruby-on-rails-4 nested-attributes strong-parameters