Методы вызова в ActiveJob выполняют

Я получаю No Method Error, когда звоню на работу. Я не знаю почему. Это фактическая ошибка:

NoMethodError: undefined method `get_customers' for #
<GetCustomersJob:0x007f15280e4270>

Я изучаю ActiveJob и создал свою первую работу, которая очень проста и вызывает метод, определенный в моей модели Shop. Работа выглядит так:

class GetCustomersJob < ActiveJob::Base
  queue_as :default

  def perform(current_shop)
    current_shop.get_customers.perform
  end
end

get_customers отлично определено в моей модели магазина, а current_shop является объектом модели Shop. get_customers работает должным образом вне этой работы. Я просто не могу заставить его работать в рамках этой работы.

Я также пробовал:

Shop.current_shop.get_customers.perform

Что я сделал не так?


person ToddT    schedule 03.05.2017    source источник


Ответы (2)


Во-первых, измените метод perform - там вы просто хотите что-то выполнить, в вашем случае вы хотите вызвать get_customers для объекта current_shop. Так что сделай это.

class GetCustomersJob < ActiveJob::Base
  queue_as :default

  def perform(current_shop)
    current_shop.get_customers # removed .perform
  end
end

Позже, вы хотите назвать работу. Для этого вы пишете имя класса задания и используете perform_now для немедленного запуска задания:

GetCustomersJob.perform_now(Shop.current_shop)

или perform_later, чтобы поставить задание в очередь на потом:

GetCustomersJob.perform_later(Shop.current_shop)
person Andrey Deineko    schedule 03.05.2017
comment
Да, все еще получаю ту же самую ошибку. Я обновил OP, но его высказывание get_customers не определено в job. Верно, это определено на модели. И я передаю объект Shop для работы... отсюда и мое замешательство - person ToddT; 03.05.2017
comment
@ToddT Мне очень любопытно, нашли ли вы причину ошибки? - person Andrey Deineko; 05.05.2017
comment
В итоге оказалось, что с моим кодом все в порядке, я не перезапускал Sidekiq, поэтому изменения в моем коде не учитывались. Урок усвоен! Спасибо за помощь - person ToddT; 05.05.2017
comment
@ToddT Правда, sidekiq необходимо перезапускать при каждом изменении кода. - person Andrey Deineko; 05.05.2017
comment
@ToddT, хотя я сомневаюсь, что это current_shop.get_customers.perform правильно ... (я говорю, что это неправильно) - person Andrey Deineko; 05.05.2017
comment
Да, вы правы. Я убрал perform, поэтому пометил ваш ответ как правильный. еще раз спасибо! - person ToddT; 05.05.2017

Я забыл назвать тестовый класс с Test в конце, поэтому perform_now не был определен.

(пишу это для себя в будущем :wave:)

person Dorian    schedule 22.02.2021