DRY设计需要异步发送电子邮件的模型

时间:2017-07-21 20:15:14

标签: ruby-on-rails devise dry

我的应用中有多个Devise模型(用户,管理员等)。我可以通过覆盖每个模型中的#send_devise_notification来异步发送Devise通知电子邮件。

# 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

由于这个代码在所有模型中完全相同,我想我可以创建一个名为DeviseAsyncCapable的Concern,它实现#send_devise_notification,就像我上面描述的那样。

# 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

在其中一个模型中包含关注并对其进行测试后,未调用关注中定义的方法,而是设计内联电子邮件。我怎么能干这个代码?

1 个答案:

答案 0 :(得分:0)

更新 - 回答

正如bcd回复的那样,你需要在调用devise后包括这个问题:database_autheticable

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

  include DeviseAsyncCapable
end