web-dev-qa-db-ja.com

オプションハッシュをsidekiqワーカーに渡す

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
12
Blankman

これは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"}
14
dlachasse

ジョブパラメータは有効なJSONタイプである必要があります。

https://github.com/mperham/sidekiq/wiki/Best-Practices#1-make-your-job-parameters-small-and-simple

8
Mike Perham