【问题标题】:How can I resend a Devise confirmation email automatically, but only once, for users who have not confirmed?如何为尚未确认的用户自动重新发送 Devise 确认电子邮件,但只发送一次?
【发布时间】:2017-01-06 00:50:23
【问题描述】:

我正在使用带有 Devise confirmable 的 Rails。当用户注册时,Devise 会自动向他们发送一封确认电子邮件。如果他们三天后仍未确认,我想向他们发送另一封带有新令牌的确认电子邮件。如果他们在第二封电子邮件后仍未确认,我们不应再向他们发送。绘制在时间线上:

  • 第 1 天: 用户注册并收到确认电子邮件;不确认
  • 第 2 天:用户未确认
  • 第 3 天: 发送另一封电子邮件,提示他们确认;不确认
  • 第 4 天: 用户未确认;不再发送电子邮件
  • 第 5 天: 用户未确认;不再发送电子邮件
  • 第 6 天: 等等。

我不想在我的用户模型中添加一个新列来跟踪他们收到了多少次确认电子邮件,因为我认为我可以在每天运行的 Worker 中使用我们已经拥有的信息来完成它有。但是,我在正确处理逻辑方面有点挣扎。

这是我目前所拥有的:

# workers/resend_confirmation_worker.rb

class ResendConfirmationWorker
  include Sidekiq::Worker
  sidekiq_options queue: :resend_confirmation, retry: false

  def perform
    users = User.where('confirmation_sent_at IS NOT NULL and
                        confirmed_at IS NULL')
    users.each do |user|
      return if user.created_at < Time.zone.now - 4.days || user.created_at > Time.zone.now - 3.days
      user.resend_confirmation!
  end
end

# config/clock.rb

module Clockwork
  every(1.day, 'Resend confirmation') { ResendConfirmationWorker.perform_async }
end

感谢任何帮助或改进建议。

【问题讨论】:

  • 使用.find_each分批加载记录以避免潜在的耗尽可用内存。

标签: ruby-on-rails devise devise-confirmable


【解决方案1】:

如果你打算每天运行一次 worker,你可能会使用类似的东西:

User.where('
  confirmed_at IS NULL
  AND created_at >= ?
  AND created_at <= ?
', 2.days.ago.beginning_of_day, 2.days.ago.end_of_day)

如果您在周三运行,它会获取周一注册的所有未确认用户。

【讨论】:

    【解决方案2】:
    d = 2.days.ago
    users = User.where.not(confirmation_sent_at: nil)
                .where(confirmed_at: nil)
                .where(created_at: d.beginning_of_day..d.end_of_day)
    
    users.find_each do |user|
      user.resend_confirmation!
    end
    

    【讨论】:

      【解决方案3】:

      max 发布的答案几乎是完美的,但是您需要使用user.send_confirmation_instructions 而不是resend_confirmation!,并且如果工人在一天内意外运行不止一次(例如由于测功机重新启动),人们可能会收到太多确认电子邮件。

      现在我只想知道why my tests aren't working

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-08-18
        • 2016-09-26
        • 1970-01-01
        • 2016-09-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-03-03
        相关资源
        最近更新 更多