Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 将强参数与嵌套的原始JSON参数一起使用_Ruby On Rails - Fatal编程技术网

Ruby on rails 将强参数与嵌套的原始JSON参数一起使用

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\

我的web应用程序中有一个更新表单,在允许从该表单接收参数时遇到问题。以下是参数访问控制器的方式:

<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: [] }
)