Params(JSON)オプションをsidekiqワーカーメソッドに渡そうとしたときに、次のようなオプションを参照していたため、うまく機能しなかったのを覚えています。
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ページ が述べていることです:
perform_async
に渡す引数は、文字列、整数、浮動小数点数、ブール値、null、配列、ハッシュの単純なJSONデータ型で構成されている必要があります。 SidekiqクライアントAPIはJSON.dump
を使用してデータをRedisに送信します。 SidekiqサーバーはそのJSONデータをRedisから取得し、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"}
ジョブパラメータは有効なJSONタイプである必要があります。
https://github.com/mperham/sidekiq/wiki/Best-Practices#1-make-your-job-parameters-small-and-simple