Rails强参数说明如何允许嵌套数组



我有以下参数:

params={"data"=>
{"type"=>"book", 
"id"=>14, 
"attributes"=> 
{"id"=>14, 
"created_at"=>"2022-06-27 21:15:39", 
"title"=>"sdfdsf",   
"targeting"=> { "release_times"=>[["4:00", "5:00"], ["5:00", "6:00"]], 
"days"=>["Monday", "Tuesday", "Wednesday"], 
"gender"=>["male", "female"]
}
}
}

当我使用这个,我可以得到每一个值,但release_times总是null:

safe_params = params.require(:data).permit( attributes: [:id, :created_at, :title, { targeting: {} }])

如何提取释放时间值?我试着做这个

safe_params = params.require(:data).permit( attributes: [:id, :created_at, :title, { targeting: [:days, :gender, release_times:[]]}])

但是我得到错误:

验证失败:目标性别应该是一个值列表,目标日期应该是一个值列表

我如何从目标中提取所有的值,包括release_times?

作为Ruby on Rails API状态,当使用ActionController::Parameters时,你想通过将参数映射到空数组来声明参数应该是一个数组(列表)。就像你对待release_times那样。

你应该允许targeting参数与[days: [], gender: []]而不是[:days, :gender]。这将解决错误。

但即使他们,release_times是一个数组的数组,我认为目前不支持(有一个老问题)。

你可以绕过这一点的一种方法是改变你与release_times通信的方式。使用哈希数组代替嵌套数组。

从这个:

"release_times"=>[["4:00", "5:00"], ["5:00", "6:00"]]

到这个(或类似的东西):

"release_times"=>[{"start" => "4:00", "end"=>"5:00"}, {"start" =>"5:00", "end" => "6:00"}]

这样,你可以这样做:

safe_params = params.require(:data).permit(attributes: [:id, :created_at, :title, { targeting: [days: [], gender: [], release_times: [:start, :end]] }])

具体如何实现取决于你自己,但我希望它能有所帮助。

**还有,release e_times有一个错别字。


你可以自己做一些测试。打开rails c并执行如下操作:

param = ActionController::Parameters.new("targeting"=> { "release_times"=>[["4:00", "5:00"], ["5:00", "6:00"]]})
param.require(:targeting).permit(release_times: []) # > Doesn't return times.
new_param = ActionController::Parameters.new("targeting"=> { "release_times"=>[{"start" => "4:00", "end"=>"5:00"}, {"start" =>"5:00", "end" => "6:00"}] })
new_param.require(:targeting).permit(release_times: [:start, :end]) # > Return times.

只是一个观察,使用permit!可以工作。但是正如强参数文档所说:

在使用permit!时应该格外小心,因为它将允许所有当前和未来的模型属性将被大量分配。

所以你可以试着自己写slice参数而他们写permit!——但是我不能告诉你这是正确的方法。

了解更多关于大规模分配漏洞的信息。

相关内容

  • 没有找到相关文章

最新更新