我有两个活动作业,一个调用另一个。第一个活动作业完成并调用第二个活动作业,为其提供执行后要完成的方法。我运行了一个调试器,发现方法('ending_method'(.call之前的所有内容都返回刚才找到的帮助程序。在method.call之后,只有第一个助手正确返回,第二个助手返回nil,但如果我手动执行first_helper.attribute,则返回值。为什么会这样??我认为这与变量范围有关,但由于它不一致,这让我很困惑
活动作业1:
class FirstJob < ApplicationJob
include Helper
queue_as :default
before_perform do |obj|
first_helper(obj.arguments.first)
end
def perform(model_id,length)
code....
other_method
end
def other_method
second_helper ----> works fine
end
活动作业2:
class SecondJob < ApplicationJob
include Helper
queue_as :default
before_perform do |obj|
first_helper(obj.arguments.first)
end
def perform(model_id,ending_method)
code....
method(ending_method).call
end
def ending_method
second_helper ----> variable is nil
end
助手:
module Helper
def first_helper(*id_string)
return @first_helper if defined?(@first_helper)
@first_helper = Model.find_by(model_id: id_string)
end
def second_helper
return @second_helper if defined?(@second_helper)
@second_helper = first_helper.attribute
end
我在消除过程后发现了这一点,它与method((.call无关。问题如下。"if"语句中的代码(尽管为false且从未解析(正在将second_helper变量重写为nil。我意识到我无论如何都不应该这样做,因为我不是在设置对象属性,而是在设置一个变量。不知道为什么会这样。。。我觉得很奇怪。
if (false)
second_helper += 1
end
def second_helper
return @second_helper if defined?(@second_helper)
@second_helper = first_helper.attribute
end