2016-09-25 6 views
6

Я помню, когда я попытался пропускание варианта PARAMS (JSON) к способу sidekiq работника и он не работает хорошо, потому что я ссылающийся на вариант, как:Переходя к хешу опций для 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 

ответ

4

параметры работы должны быть допустимыми типами JSON:

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

+0

так что использование хэша - это плохая практика? (как описано выше в моем Q) – Blankman

+2

Использование хэша - неплохая практика; используя символы. –

5

Это то, что Sidekiq wiki page гласит:

Аргументы, которые вы передаете perform_async должен состоять из простых типов данных JSON: string, integer, float, boolean, null, array и hash. Клиентский API Sidekiq использует JSON.dump для отправки данных в Redis. Сервер Sidekiq извлекает данные JSON из Redis и использует JSON.load для преобразования данных обратно в типы Ruby для перехода к вашему методу выполнения. Не пропускайте символы, именованные параметры или сложные объекты 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"} 

 Смежные вопросы

  • Нет связанных вопросов^_^