【问题标题】:Send a welcome email after the user has confirmed his account用户确认其帐户后发送欢迎电子邮件
【发布时间】:2013-05-24 12:58:55
【问题描述】:

我正在使用 devise 和 actionmailer。我想知道如何在用户在应用程序上确认他的帐户之后而不是之前触发 actionmailer 方法。这个 actionmailer 方法只不过是一条欢迎消息。

另外,我如何获取相同的用户信息,例如姓名或电子邮件?我试过resource。但它没有用。

【问题讨论】:

  • 谷歌搜索after confirmation devise 会发现一些好文章,所以您可能想从这些文章开始。

标签: ruby-on-rails ruby-on-rails-3 devise actionmailer


【解决方案1】:

这实际上是一个相对容易的任务。您需要做的就是为您的 User 类创建一个 Observer

class UserObserver < ActiveRecord::Observer
    def after_save(user)            
        if user.confirmed_at_changed?
            #send email
        end
    end
end

【讨论】:

  • 因为从 Rails 4 开始,Observers 已经被移动到他们自己的 gem 中,并且由于 this article 中详述的原因,我会寻找 Observers 的替代品。
【解决方案2】:

Rails 3: Send welcome e-mail using Devise 有一个很好的答案 你可以做类似的事情

class User < ActiveRecord::Base
  devise # ...
  # ...
  def confirm!
    welcome_message # define this method as needed
    super
  end
  # ...
end

【讨论】:

  • 是的,但它会与确认电子邮件一起发送。那不是我想要的。我希望它发送到after 用户已确认他/她的帐户
【解决方案3】:

做到了。

after_save :send_welcome_email
  def send_welcome_email
    WelcomeEmail.notify(self).deliver if self.confirmed_at_changed?
  end

【讨论】:

    【解决方案4】:

    Devise 有一个针对这种情况的内置回调。

        # A callback initiated after successfully confirming. This can be
        # used to insert your own logic that is only run after the user successfully
        # confirms.
        #
        # Example:
        #
        #   def after_confirmation
        #     self.update_attribute(:invite_code, nil)
        #   end
        #
        def after_confirmation
        end
    

    您可以在 devise/lib/devise/models/confirmable.rb 中找到代码

    【讨论】:

      【解决方案5】:

      使用 after_save 将使您的应用程序运行并检查用户是否刚刚被确认的条件。这会导致不必要的延迟。

      我建议使用以下代码覆盖 devise 提供的默认确认功能。

      class User < ActiveRecord::Base
        devise :invitable, :database_authenticatable, :registerable, :recoverable, 
               :rememberable, :confirmable, :validatable, :encryptable
      
        # Override devise confirm! message
        def confirm!
          welcome_email
          super
        end
      
        # ...
      
      private
      
        def welcome_email
          UserMailer.welcome_message(self).deliver
        end
      
      end
      

      http://csnipp.com/s/507/-Send-welcome-mail-after-confirmation-devise

      【讨论】:

        猜你喜欢
        • 2019-01-21
        • 1970-01-01
        • 2016-05-14
        • 1970-01-01
        • 2022-08-13
        • 2021-10-26
        • 1970-01-01
        • 2022-01-15
        相关资源
        最近更新 更多