我想知道您如何访问resue块中的ActiveJob执行参数,例如
def perform object
end
rescue_from Exception do |e|
if e.class != ActiveRecord::RecordNotFound
**job.arguments.first**
# do something
end
end
谢谢你 !!
我想知道您如何访问resue块中的ActiveJob执行参数,例如
def perform object
end
rescue_from Exception do |e|
if e.class != ActiveRecord::RecordNotFound
**job.arguments.first**
# do something
end
end
谢谢你 !!
在块arguments
内部是可能的:rescue_from
rescue_from(StandardError) do |exception|
user = arguments[0]
post = arguments[1]
# ...
end
def perform(user, post)
# ...
end
这也适用于回调(例如 inside after_perform
)。
我也不知道,然后只是决定尝试self
在rescue_from
块内使用,它起作用了。
rescue_from(StandardError) do |ex|
puts ex.inspect
puts self.job_id
# etc.
end
作为旁注 - 永远不要救援Exception
:
您可以通过访问所有绑定ex.bindings
。为确保您获得正确的作业绑定,您应该像这样检查接收器1:
method_binding = ex.bindings.find { |b| b.receiver.is_a?(self.class) }
然后您可以使用.local_variable_get
. 由于方法参数也是局部变量,您至少可以显式获取它们:
user = method_binding.local_variable_get(:user)
post = method_binding.local_variable_get(:post)
因此,以您为例:
def perform object
end
rescue_from Exception do |e|
if e.class != ActiveRecord::RecordNotFound
method_binding = ex.bindings.find { |b| b.receiver.is_a?(self.class) }
object = method_binding.local_variable_get(:object)
# do something
end
end
perform
1.如果您在作业的 perform 方法中调用其他实例方法并且错误发生在那里,则此绑定仍然可能不是其中的一个。这也可以考虑,但为简洁起见。