2013-10-27 84 views
2

想知道在我的Rails應用程序(使用Sidekiq)中構建異步郵件程序的最佳方式是什麼?我有多個方法/電子郵件一個的ActionMailer類...構建異步郵件程序的最佳實踐(使用Sidekiq)

notifier.rb

class Notifier < ActionMailer::Base 
    default from: "\"Company Name\" <[email protected]>" 

    default_url_options[:host] = Rails.env.production? ? 'domain.com' : 'localhost:5000' 

    def welcome_email(user) 
    @user = user 
    mail to: @user.email, subject: "Thanks for signing up!" 
    end 

    ... 

    def password_reset(user) 
    @user = user 
    @edit_password_reset_url = edit_password_reset_url(user.perishable_token) 
    mail to: @user.email, subject: "Password Reset" 
    end 
end 

然後例如password_reset郵件在我User模型做派......

user.rb

def deliver_password_reset_instructions! 
    reset_perishable_token! 
    NotifierWorker.perform_async(self) 
end 

notifier_worker.rb

class NotifierWorker 
    include Sidekiq::Worker 
    sidekiq_options queue: "mail" 

    def perform(user) 
    Notifier.password_reset(user).deliver 
    end 
end 

所以我想我在這裏想知道一對夫婦的事情...

  1. 是否有可能定義許多「執行」,在一個單一的工人操作?通過這樣做,我可以讓事情變得簡單(一個通知者/郵件工作者),並通過它發送許多不同的電子郵件。還是我應該創造很多工人?一個用於每個郵件程序(例如WelcomeEmailWorker,PasswordResetWorker等),並將它們全部分配給與Sidekiq使用相同的「郵件」隊列。
  2. 我知道它可以正常工作,但是我應該將每種郵件方法(welcome_email,password_reset等)分解爲單獨的郵件程序類,還是可以將它們全部歸入類似Notifier的一類?

真的很感謝這裏的任何建議。謝謝!

+0

你可以簡單地使用:'Notifier.delay.password_reset(user)'。無需創建單獨的工作人員。看到這裏:https://github.com/mperham/sidekiq/wiki/Delayed-Extensions –

+0

極樂!棒極了。感謝您的參考。如果你想補充說,我會接受。 – gbdev

回答

3

作爲discussed here,Sidekiq默認支持延遲郵件,所以沒有必要建立獨立的工人:

Notifier.delay.password_reset(user.id)

2

我不知道,但我認爲它不是一個好主意,通過一個實例中郵件的動作,如果你使用延遲,所以也許最好把上面的代碼改爲:

Notifier.delay.password_reset(user.id)