ruby-on-rails – 如何将current_user传递给Sidekiq的Worker

我试图将current_user或User.find(1)传递给工作模块,但在sidekiq的仪表板中获取错误(localhost:3000 / sidekiq / retries):

NoMethodError: undefined method `supports’ 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服务器没有任何区别.这是在我的开发机器上.

解决方法

Sidekiq documentation

The arguments you pass to perform_async must be composed of simple
JSON datatypes: string,integer,float,boolean,null,array and hash.
The Sidekiq client API uses JSON.dump to send the data to Redis. The
Sidekiq server pulls that JSON data from Redis and uses JSON.load to
convert the data back into Ruby types to pass to your perform method.
Don’t pass symbols or complex Ruby objects (like Date or Time!) as
those will not survive the dump/load round trip correctly.

传递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

相关文章

validates:conclusion,:presence=>true,:inclusion=>{...
一、redis集群搭建redis3.0以前,提供了Sentinel工具来监控各...
分享一下我老师大神的人工智能教程。零基础!通俗易懂!风趣...
上一篇博文 ruby传参之引用类型 里边定义了一个方法名 mo...
一编程与编程语言 什么是编程语言? 能够被计算机所识别的表...
Ruby类和对象Ruby是一种完美的面向对象编程语言。面向对象编...