Ruby on rails 将强参数与嵌套的原始JSON参数一起使用
我的web应用程序中有一个更新表单,在允许从该表单接收参数时遇到问题。以下是参数访问控制器的方式:Ruby on rails 将强参数与嵌套的原始JSON参数一起使用,ruby-on-rails,Ruby On Rails,我的web应用程序中有一个更新表单,在允许从该表单接收参数时遇到问题。以下是参数访问控制器的方式: <ActionController::Parameters {"company"=>{"description"=>"description", "email_address"=>"contact@gmail.com", "hours"=>"{\"fri\":[],\"mon\":[[\"09:00\",\"16:00\"]],\"sat\":[], \"sun\
<ActionController::Parameters {"company"=>{"description"=>"description",
"email_address"=>"contact@gmail.com",
"hours"=>"{\"fri\":[],\"mon\":[[\"09:00\",\"16:00\"]],\"sat\":[],
\"sun\":[[\"09:00\",\"16:00\"]],
\"thu\":[[\"09:00\",\"12:00\"], [\"13:00\",\"16:00\"]],
\"tue\":[[\"08:45\",\"16:00\"]],\"wed\":[[\"09:00\",\"16:00\"]]}"},
"controller"=>"my_controller", "action"=>"update"} permitted: false>
例如,小时表示商店的营业时间。它被一周中的几天隔开。每天可以没有一天的值,只有一个或两个值。解析后的小时是数组的散列,这些数组可以是空的,也可以有一个或两个数组
我的问题是在使用params.require(:company.permit()
时是否允许使用此小时参数。我尝试了很多不同的方法,比如:
参数要求(:公司)。许可证(:说明,:电子邮件地址,:小时)
params.require(:company).permit(:description,:email\u address,hours:{})
params.require(:company).permit(:description,:email\u address,hours:[])
params.require(:company).permit(:description,:email_address,hours:{[sun:[],mon:[],tue:[],wed:[],thu:[],fri:[],sat:[])的时间:{/code>
params.require(:company)。permit(:description,:email_address,hours:[[sun:[],mon:[],tue:[],wed:[],thu:[],fri:[],sat:[])
- 及其他
<ActionController::Parameters {"description"=>"description",
"email_address"=>"contact@gmail.com",
"hours"=><ActionController::Parameters {"sun"=>[], "mon"=>[], "tue"=>[],
"wed"=>[], "thu"=>[], "fri"=>[], "sat"=>[]} permitted: true>} permitted: true>
“说明”,
“电子邮件地址”=>“contact@gmail.com",
“小时数”=>[],“周一”=>[],“周二”=>[],
“wed”=>[],“thu”=>[],“fri”=>[],“sat”=>[]}允许:真>}允许:真>
谢谢!Rails实际上没有用于将嵌套数组白名单的语法 这将:
params.require(:company)
.permit(:description, :email_address, hours: { mon: [] })
允许在公司[:hours][:mon]
中使用任何标量值。但是,数组不是:
这就解释了为什么这些值被“丢弃”。我认为rails根本不知道如何使用permit(hours:{mon:[[]]})
但是,如果您只是修复传入的JSON或在Ruby中转换它,这是很容易避免的
json = if params[:company][:hours].present?
# @todo handle JSON parsing errors
# use each_with_object instead if your Ruby is older than 2.4
JSON.parse(params[:company][:hours])
&.transform_values { |v| v.empty? ? v : v.first }
end
params.merge(
hours: json
).permit(
:description, :email_address,
hours: { sun: [], mon: [], tue: [], wed: [], thu: [], fri: [], sat: [] }
)
这是因为它将
“mon”=>[[“09:00”,“16:00”]]
转换为“mon”=>[“09:00”,“16:00”]
和“09:00”,“16:00”是字符串,因此允许使用标量值。A)不清楚您是如何提供的,也不清楚它是如何接收的。B)为什么使用Rails 4和5?我删除了RoR 4和5标记。该项目使用Rails 5.1.6.2。我编辑了我问题的开头。我希望现在没问题,但请随意提问。谢谢!标记现在更好了。问题是这个数据是怎么回事ng in?例如,如果数据丢失,它是如何接收和解码的?它在链中的哪个点丢失?最后一个示例,您有一个额外的[小时数属性,您可以修复它并进行尝试吗?参数要求(:company).permit(:description,:email_address,hours:[太阳:[],星期一:[],星期二:[],星期三:[],星期四:[],星期五:[],星期六])代替参数require(:company).permit(:description,:email_address,hours:[[sun:[],mon:[],tue:[],wed:[],thu:[],fri:[],sat:[]))请记住,hours
在解码之前不会有这种结构。我建议A)将所有参数作为JSON提供,或B)像其他参数一样使用URI编码的参数提供。@tadman是对的,不过你应该首先找到更好的解决方案。这太令人讨厌了。
[ String, Symbol, NilClass, Numeric, TrueClass, FalseClass, Date, Time, ActionDispatch::Http::UploadedFile, Rack::Test::UploadedFile ]
json = if params[:company][:hours].present?
# @todo handle JSON parsing errors
# use each_with_object instead if your Ruby is older than 2.4
JSON.parse(params[:company][:hours])
&.transform_values { |v| v.empty? ? v : v.first }
end
params.merge(
hours: json
).permit(
:description, :email_address,
hours: { sun: [], mon: [], tue: [], wed: [], thu: [], fri: [], sat: [] }
)