延迟和/或重新发送Devise的手动创建用户的确认电子邮件

我正在使用Devise来允许用户注册,以及使用我自己的用户admin来手动创建用户。 当我在管理员中创建用户时,Devise会立即向新用户发送确认。 我相信这是因为设计和我的管理员都使用相同的模型。 在管理员准备发送此电子邮件之前,如何延迟此电子邮件?

此外,Devise的validation要求管理员为新用户设置密码。 我更希望手动创建的用户在回复确认时指定自己的密码。 现在手动创建的用户将不知道他们的密码,除非我在补充电子邮件中发送它们。

我们在其中一个应用中执行此操作。 您可以告诉Devise NOT自动发送如下确认:

@user.skip_confirmation! 

然后,你可以做到

 Devise::Mailer.confirmation_instructions(@user).deliver 

对于Rails 2.x,您可以执行以下操作:

 DeviseMailer.deliver_confirmation_instructions(@user) 

@ user.skip_confirmation! 确认用户,因此用户无需使用确认即可登录。

这适用于我的设计3.5

停止设计以在创建用户时发送确认电子邮件。

 @user.skip_confirmation_notification! 

稍后发送确认说明

 @user.send_confirmation_instructions 

解决方案并不像@Ryan Heneise那样简单。 如果你做@user.skip_confirmation! 它确认了用户,因此用户可以在不使用确认的情况下登录,因此在这种情况下确认信是没用的。 此解决方案不允许用户在没有确认的情况下登录: Rails 3 with Devise for Authentication – 如何手动创建用户?

现在有一种更简单的方法(在v2.2.4中添加)

Devise的可确认模块现在包含完美的skip_confirmation_notification! 允许更清洁解决方案的方法:

 @user = User.new params[:user] @user.skip_confirmation_notification! @user.save # ... do stuff, then later... Devise::Mailer.confirmation_instructions(@user).deliver 

我只是花了一些时间研究这个,基本上你只需要添加它并设置delayed_job 。

 def send_confirmation_instructions generate_confirmation_token! if self.confirmation_token.nil? ::Devise.mailer.delay.confirmation_instructions(self) end 

将其作为受保护的方法添加到您的用户模型中,以覆盖可确认的设备 。 另外,请注意gem刚刚更新,以便在创建时添加一个新方法,以发送确认指令 。

你使用延迟工作吗? 它允许您为延迟运行定义单个方法。