首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在ActiveJob rails中正确传递“请求”参数?

如何在ActiveJob rails中正确传递“请求”参数?
EN

Stack Overflow用户
提问于 2022-04-28 05:47:48
回答 2查看 603关注 0票数 0

我想传递请求参数,以便在delayed_job上执行它,如下所示:

ObserveJob.perform_later(请求)

但是错误总是ActiveJob::SerializationError:不支持的参数类型: ActionDispatch::Request

是否有一种方法可以在rails中传递此内置请求params,以便它能够使用delayed_job正确执行?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-04-28 15:06:42

而不是传递整个request对象-这是相当大和复杂的-只传递您实际需要的属性到作业。这有几个优点:

大型、复杂和嵌套对象(如问题中的faster.

  • Passing )很难序列化,甚至可能根本不支持序列化。非常“基本”类(如数字或字符串)的简单对象(如数字或字符串)更容易序列化,在序列化的表示中需要更少的内存,这最终使作业成为一个复杂的对象,而作业只需要某些属性就可以为作业添加不必要的依赖。作业需要知道请求对象是如何工作的,以及如何将所需的属性从那个object.

  • Passing简单对象获取到一个方法,这样测试就更容易了,因为您不需要构建复杂的东西就可以测试该方法。

我会将perform方法更改为

代码语言:javascript
运行
复制
def perform(path:, referer:, url: remote_ip:, user_agent:, location:)
  # ...
end

就这样叫它:

代码语言:javascript
运行
复制
ObserveJob.perform_later(
  path:       request.path,
  referer:    request.referer,
  url:        request.url,
  remote_ip:  request.remote_ip,
  user_agent: request.user_agent,
  location:   request.location
)
票数 0
EN

Stack Overflow用户

发布于 2022-04-28 08:14:23

一个人可以通过多种方式:

代码语言:javascript
运行
复制
Delayed::Job.enqueue(Abc.new(param1, param2, queue: "Update Derive")

延迟的工作就像:

代码语言:javascript
运行
复制
class Abc < Struct.new(:param1, :param2)
  def perform
    sum = param1 + param2
    ...
  end
end
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72038580

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档