首页 > 解决方案 > 是否可以在 before_enqueue 回调中访问作业的参数?

问题描述

我想在before_enqueue回调中执行一些初始参数验证,以便在作业入队时如果存在问题,我可以提出问题。

这将允许我立即向用户提供有关问题的反馈,而不是让作业尝试运行、失败,然后以某种方式将反馈提供给用户。

在 API 文档中看到将作业对象传递给回调,但是从 API 文档和Rails 指南perform中不清楚如何从该对象获取参数。

标签: ruby-on-railsrails-activejob

解决方案


通过对 REPL 的一些探索,我发现job传递给回调的对象有一个arguments访问器,它是一个参数数组。

使用普通参数,它们将按arguments位置排列在数组中:

class TestJob < ApplicationJob
  def perform(arg1, arg2); end

  before_enqueue { |job| puts job.arguments }
end

TestJob.perform_later(:foo, 'bar')
# [:foo, "bar"]

使用命名参数,它们位于数组第一个位置的哈希中:

class TestJob < ApplicationJob
  def perform(arg1:, arg2:); end

  before_enqueue { |job| puts job.arguments }
end

TestJob.perform_later(arg1: :foo, arg2: 'bar')
# [{:arg1=>:foo, :arg2=>"bar"}]

推荐阅读