如何将current_user传递给Sidekiq的工作者

时间:2015-12-20 10:52:43

标签: ruby-on-rails ruby ruby-on-rails-4 sidekiq

我正在尝试将current_userUser.find(1)传递给工作模块,但在sidekiq的信息中心(localhost:3000 / sidekiq / retries)中收到错误:

  

NoMethodError:未定义的方法`支持' for"#":String

注意:我的关系很好,即:

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

supports_controller.rb:

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

 ...

end

应用/工人/ projects_worker.rb:

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

重新启动我的sidekiq服务器没有任何区别。这是在我的开发机器上。

1 个答案:

答案 0 :(得分:7)

来自Sidekiq documentation

  

传递给perform_async的参数必须由simple组成   JSON数据类型:字符串,整数,浮点数,布尔值,空值,数组和哈希值。   Sidekiq客户端API使用JSON.dump将数据发送到Redis。该   Sidekiq服务器从Redis中提取JSON数据并使用JSON.load   将数据转换回Ruby类型以传递给您的perform方法。   不要将符号或复杂的Ruby对象(如日期或时间!)传递为   这些将无法在转储/装载往返中正常存在。

传递id而不是object:

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