我有以下参数:
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!
——但是我不能告诉你这是正确的方法。
了解更多关于大规模分配漏洞的信息。