Как передать current_user в Worker Sidekiq

Я пытаюсь передать current_user или User.find(1) рабочему модулю, но получаю сообщение об ошибке на панели инструментов sidekiq (localhost:3000/sidekiq/retries):

NoMethodError: неопределенный метод "поддерживает" для "#":String

примечание: мои отношения в порядке т.е.:

u = User.find(1)
u.supports
#=> []

supports_controller.rb:

def create
 @user = current_user
 ProjectsWorker.perform_async(@user)

 ...

end

приложение/workers/projects_worker.rb:

class ProjectsWorker
  include Sidekiq::Worker
  def perform(user)
    u = user
    @support = u.supports.build(support_params)
  end
end

Перезапуск моего сервера sidekiq не имеет значения. Это на моей машине разработки.


person Sylar    schedule 20.12.2015    source источник


Ответы (1)


Из Sidekiq documentation:

Аргументы, которые вы передаете в Perform_async, должны состоять из простых типов данных JSON: строка, целое число, число с плавающей запятой, логическое значение, ноль, массив и хэш. Клиентский API Sidekiq использует JSON.dump для отправки данных в Redis. Сервер Sidekiq извлекает эти данные JSON из Redis и использует JSON.load для преобразования данных обратно в типы Ruby для передачи вашему методу выполнения. Не передавайте символы или сложные объекты Ruby (например, дату или время!), так как они не сохранятся при выполнении дампа/загрузки корректно.

Передайте идентификатор вместо объекта:

def create
  ProjectsWorker.perform_async(current_user.id)
end

работник:

class ProjectsWorker
  include Sidekiq::Worker
  def perform(user_id)
    u = User.find(user_id)
    @support = u.supports.build(support_params)
  end
end
person Зелёный    schedule 20.12.2015
comment
Спасибо! support_params — это метод. Могу ли я сказать s = support_params и передать его вместе с user_id? - person Sylar; 20.12.2015
comment
Прочтите документацию, должен состоять из простых типов данных JSON: строка, целое число, число с плавающей запятой, логическое значение, ноль, массив и хэш., если support_params является хэшем, вы можете. - person Зелёный; 20.12.2015