Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/extjs/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 如何为尚未确认的用户自动(但仅一次)重新发送设计确认电子邮件?_Ruby On Rails_Devise_Devise Confirmable - Fatal编程技术网

Ruby on rails 如何为尚未确认的用户自动(但仅一次)重新发送设计确认电子邮件?

Ruby on rails 如何为尚未确认的用户自动(但仅一次)重新发送设计确认电子邮件?,ruby-on-rails,devise,devise-confirmable,Ruby On Rails,Devise,Devise Confirmable,我正在将Rails与designeconfirmable一起使用。当用户注册时,Desive会自动向他们发送一封确认电子邮件。如果他们三天后还没有确认,我想再给他们发一封带有新令牌的确认电子邮件。如果他们在这第二封邮件之后仍然没有确认,我们将不再发送他们。在时间表上绘制: 第1天:用户注册并收到确认电子邮件;不确定 第2天:用户未确认 第3天:再发送一封电子邮件,提示他们确认;不确定 第4天:用户未确认;不再发送电子邮件 第5天:用户未确认;不再发送电子邮件 第6天:等 我不希望在我的用户模

我正在将Rails与designe
confirmable
一起使用。当用户注册时,Desive会自动向他们发送一封确认电子邮件。如果他们三天后还没有确认,我想再给他们发一封带有新令牌的确认电子邮件。如果他们在这第二封邮件之后仍然没有确认,我们将不再发送他们。在时间表上绘制:

  • 第1天:用户注册并收到确认电子邮件;不确定
  • 第2天:用户未确认
  • 第3天:再发送一封电子邮件,提示他们确认;不确定
  • 第4天:用户未确认;不再发送电子邮件
  • 第5天:用户未确认;不再发送电子邮件
  • 第6天:
我不希望在我的用户模型中添加一个新的专栏,记录他们收到确认电子邮件的次数,因为我认为我可以在每天使用我们已有信息运行的工作人员中这样做。然而,我正在努力让逻辑正确一些

以下是我目前掌握的情况:

# 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
\worker/ressend\u confirmation\u worker.rb
类ResendConfirmationWorker
包括Sidekiq::Worker
sidekiq_选项队列::重新发送确认,重试:false
def执行
用户=用户。其中('confirmation\u sent\u at'不为空,并且
已确认\u at为空')
用户。每个do |用户|
如果user.created_在Time.zone.now-3.days时返回
user.ressend\u确认!
结束
结束
#config/clock.rb
模块发条
每(1.1天,“重新发送确认”){ResendConfirmationWorker.perform\u async}
结束

感谢您提供的任何帮助或改进建议。

如果您打算每天运行一次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)
User.where('
已确认的\u at为空
并在>=处创建了_?

如果您打算每天运行一次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)
User.where('
已确认的\u at为空
并在>=处创建了_?
并在创建了\u。发布的答案几乎是完美的,但是您需要使用
用户。发送\u确认\u说明
而不是
重新发送确认!
,并且如果工作人员由于意外(例如,由于dyno重新启动)每天运行一次以上,人们可能会收到太多确认电子邮件

现在我想弄清楚的是。

发布的答案几乎完美,但是您需要使用
用户。发送确认指示,而不是
重新发送确认!
,以及工作人员是否因意外原因(例如,由于dyno重新启动)每天运行不止一次,人们可能会收到太多的确认电子邮件


现在我想弄清楚的是。

使用
。查找每个
分批加载记录以避免可能耗尽可用内存。使用
。查找每个
分批加载记录以避免可能耗尽可用内存。