Bla*_*man 12 ruby-on-rails sidekiq
我记得当我尝试将params(JSON)选项传递给sidekiq worker方法时,它没有很好用,因为我引用了以下选项:
options[:email_address]
Run Code Online (Sandbox Code Playgroud)
但我认为如果我这样做会有效:
options["email_address"]
Run Code Online (Sandbox Code Playgroud)
因此,出于某种原因,当它被序列化和反序列化时,哈希只能用字符串而不是符号来引用.
这是安全的做法吗?
我有一个交易电子邮件工作者,看起来像:
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
Run Code Online (Sandbox Code Playgroud)
小智 14
这就是Sidekiq 维基页面所说的内容:
传递给的参数
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: "someemailaddress@gmail.com", something_else: "thing"})
=> "{\"email_address\":\"someemailaddress@gmail.com\",\"something_else\":\"thing\"}"
JSON.load(serialized_args)
=> {"email_address"=>"someemailaddress@gmail.com", "something_else"=>"thing"}
Run Code Online (Sandbox Code Playgroud)
作业参数必须是有效的JSON类型:
https://github.com/mperham/sidekiq/wiki/Best-Practices#1-make-your-job-parameters-small-and-simple
归档时间: |
|
查看次数: |
5160 次 |
最近记录: |