我记得当我尝试将params(JSON)选项传递给sidekiq worker方法时,它没有很好用,因为我引用了以下选项:
options[:email_address]
但我认为如果我这样做会有效:
options["email_address"]
因此,出于某种原因,当它被序列化和反序列化时,哈希只能用字符串而不是符号来引用。
这是一种安全的做法吗?
我有一个交易电子邮件工作者,看起来像:
class TransactionEmailWorker
include Sidekiq::Worker
def perform(action, options)
case action
when 'welcome'
welcome(options["email_address"], options["something_else"])
when 'reset_password'
reset_password(options["email_address"])
end
end
def welcome(email, title)
# ...
end
def reset_password(email)
# ..
end
这就是Sidekiq wiki page所说的:
传递给
perform_async
的参数必须由简单的JSON数据类型组成:string,integer,float,boolean,null,array和hash。 Sidekiq客户端API使用JSON.dump
将数据发送到Redis。 Sidekiq服务器从Redis中提取JSON数据并使用JSON.load
将数据转换回Ruby类型以传递给您的perform方法。不要传递符号,命名参数或复杂的Ruby对象(如Date或Time!),因为这些对象无法正确转储/加载往返。
传递Ruby哈希是有效的,因为它能够序列化为有效的JSON。所以回答你的问题,这是安全的做法。
serialized_args = JSON.dump({email_address: "[email protected]", something_else: "thing"})
=> "{\"email_address\":\"[email protected]\",\"something_else\":\"thing\"}"
JSON.load(serialized_args)
=> {"email_address"=>"[email protected]", "something_else"=>"thing"}