向工作人员发送嵌套参数时出现意外令牌 - Rails 6
Posted
技术标签:
【中文标题】向工作人员发送嵌套参数时出现意外令牌 - Rails 6【英文标题】:Unexpected token when sending nested params to worker - Rails 6 【发布时间】:2022-01-20 10:30:14 【问题描述】:我有一个 Sidekiq 工作人员,我将控制器参数发送给该工作人员。我的控制器参数如下所示。
def my_params
params.require(:users).permit(employees: [:param1, param_requested_attributes: [:attribute]])
end
因此,当我将 JSON 发送到控制器并使用 byebug 进行检查时,参数的格式正确,但是当我将它们发送给工作人员时:
MyWorker.perform_async(my_params)
我将每个“员工”迭代为:
my_params.each do |employee|
data = JSON.parse(raw_data.gsub('=>', ':')) # to correctly format my json data
end
我收到“意外令牌错误”,因为“params_requested_attributes”看起来像:
"params_requested_attributes"=>[<ActionController::Parameters> "attribute"=>"value" permitted: true> ]
我的问题是,在尝试 JSON.parse 我的参数时如何避免这个“ActionController::parameters”?只有当我尝试使用这些nested_attributes 时才会发生这种情况。我只想要一个原始 json,但由于某种原因,我得到了这个“动作控制器参数”。
【问题讨论】:
请包含您在控制器中获得的原始参数。 【参考方案1】:JSON.parse
将 json 字符串转换为 ruby 对象。因此,如果您只需要原始 json 字符串,则应使用 raw_data
并跳过 .gsub
调用。
但是,我无法从您的示例中看到 raw_data
与员工价值的关系。
【讨论】:
谢谢杰拉德,当我将参数发送给工作人员时,我的问题实际上出现了(出于某种原因,它发送为)"params_requested_attributes"=>[<ActionController::Parameters> "attribute"=>"value" permitted: true> ]
而不是"params_requested_attributes"=>["attribute"=>"value"]
【参考方案2】:
你的问题是my_params
:
def my_params
params.require(:users).permit(...)
end
给你一个ActionController::Parameters
的实例,而里面的params_requested_attributes
是ActionController::Parameters
的另一个实例。然后您将作业排入队列:
MyWorker.perform_async(my_params)
它必须将my_params
序列化到数据库中,并且序列化并没有按照您希望的方式处理内部ActionController::Parameters
。
您可以自己将参数转换为嵌套哈希:
MyWorker.perform_async(my_params.to_h)
摆脱ActionController::Parameters
并最终在您的工作中使用普通哈希和数组。
如果你真的想要你的工作手动解包的 JSON,那么你将不得不再按摩my_params
一点。也许您想要my_params.to_h
,然后是 JSON 编码,然后嵌套 params_requested_attributes
。这听起来像是寻找问题的解决方案,我认为将my_params.to_h
传递给工作是您想要去的地方。
【讨论】:
就是这样!谢谢你。我实际上已经找到了“某种”解决方案,但我只是在做“.to_h”而不是“.to_unsafe_h”。我将阅读两者之间的区别以了解使用哪一个。谢谢!! 在这种情况下,您使用#to_h
或#to_unsafe_h
都没有关系,老实说,我应该使用to_h
。一般来说,如果你想将params
解压成一个没有任何强参数的散列,你会使用to_unsafe_h
。以上是关于向工作人员发送嵌套参数时出现意外令牌 - Rails 6的主要内容,如果未能解决你的问题,请参考以下文章
SyntaxError:在 Heroku 上托管 Discord 机器人时出现意外的令牌 '??='