2017-07-21 1 views
0

J'ai plusieurs modèles Devise dans mon application (utilisateur, administrateur, etc.). Je peux envoyer des e-mails de notification Devise de manière asynchrone en remplaçant #send_devise_notification dans chacun des modèles.Modèles DRY Devise qui doivent envoyer des e-mails de manière asynchrone

# user.rb, admin.rb, etc 

private 
## 
# Uses Active::Job to send Devise's emails asynchronously. 
## 
def send_devise_notification(notification, *args) 
    devise_mailer.send(notification, self, *args).deliver_later 
end 

Puisque ce code est exactement le même dans tous les modèles, je pensais que je pouvais faire une préoccupation appelée DeviseAsyncCapable qui met en œuvre #send_devise_notification la même manière que je décris ci-dessus.

# devise_async_capable.rb 
module DeviseAsyncCapable 
    extend ActiveSupport::Concern 

    def send_devise_notification(notification, *args) 
    devise_mailer.send(notification, self, *args).deliver_later 
    end 
end 

# user.rb 
class User < ActiveRecord::Base 
    include DeviseAsyncCapable 
end 

Après y compris la préoccupation dans l'un des modèles et de le tester, la méthode définie dans le souci n'a pas été appelé, au lieu des e-mails en ligne envoyé Devise. Comment puis-je sécher ce code?

+1

Inclure DeviseAsyncCapable après 'concevoir: database_autheticable' – bcd

Répondre

0

Mise à jour - Réponse

Comme DCB a répondu, vous devez inclure la préoccupation après que vous appelez concevoir: database_autheticable

#user.rb 
class User < ActiveRecord::Base 
    devise :database_authenticatable#, ... 

    include DeviseAsyncCapable 
end