向工作人员发送嵌套参数时出现意外令牌 - 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"=&gt;[&lt;ActionController::Parameters&gt; "attribute"=&gt;"value" permitted: true&gt; ] 而不是"params_requested_attributes"=&gt;["attribute"=&gt;"value"]【参考方案2】:

你的问题是my_params:

def my_params
  params.require(:users).permit(...)
end

给你一个ActionController::Parameters 的实例,而里面的params_requested_attributesActionController::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 机器人时出现意外的令牌 '??='

当我已经定义了变量时出现意外的令牌错误

尝试运行 Angular Universal 时出现“意外的令牌导入”错误

运行笑话测试时出现意外的令牌导入错误

在 Typescript 项目上运行业力覆盖时出现意外令牌