【问题标题】:Delay and or resend Devise's confirmation email for manually created users为手动创建的用户延迟和/或重新发送 Devise 的确认电子邮件
【发布时间】:2010-12-03 07:46:13
【问题描述】:

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

此外,Devise 的验证要求管理员为新用户设置密码。我更希望手动创建的用户在响应确认时指定自己的密码。现在手动创建的用户不会知道他们的密码,除非我通过补充电子邮件发送给他们。

【问题讨论】:

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


    【解决方案1】:

    @user.skip_confirmation!确认用户,所以用户可以登录 不使用确认。

    这在设计 3.5 中适用于我

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

    @user.skip_confirmation_notification! 
    

    稍后发送确认说明

    @user.send_confirmation_instructions
    

    【讨论】:

    • 这应该是最佳答案。 skip_confirmation! 自动确认用户,因此它对 OP 的用例毫无意义。
    【解决方案2】:

    我们在其中一款应用中执行此操作。你可以告诉 Devise 不要像这样自动发送确认:

    @user.skip_confirmation!
    

    然后,你可以做

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

    对于 Rails 2.x,你可以这样做:

    DeviseMailer.deliver_confirmation_instructions(@user)
    

    【讨论】:

    • 我还应该提到你必须设置@user.skip_confirmation! 在保存记录之前
    • 正如 dombesz 在他的回答中提到的 - @user.skip_confirmation!,这样做:self.confirmed_at = Time.now.utc,所以后来你有:user.active? == true...用户可以做所有事情,就好像他已经确认了他的电子邮件一样...
    • 我正在使用 user.send_confirmation_instructions,因为如果不存在,它将生成一个确认令牌
    • 这个方法的签名在最新的设计中没有改变吗?现在是 DeviseMailer.deliver_confirmation_instructions(@user, token) rubydoc.info/github/plataformatec/devise/master/Devise/…
    • 是的,签名在更高版本中已更改。请参阅stackoverflow.com/a/16548371/899160 以获得有效的解决方案。
    【解决方案3】:

    解决方案并不像@Ryan Heneise 的回答那么简单。如果你做@user.skip_confirmation!它确认用户,所以用户可以不使用确认登录,所以这种情况下的确认信是没有用的。此解决方案不允许用户在没有确认的情况下登录:Rails 3 with Devise for Authentication - How do I manually create a user?

    【讨论】:

    • 好点。在我的应用中,这是期望的行为,但需要注意。
    【解决方案4】:

    现在有一种更简单的方法(在 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 
    

    【讨论】:

      【解决方案5】:

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

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

      将它作为受保护的方法添加到您的用户模型中,以覆盖confirmable 中的设计。另外,请注意 gem 刚刚更新以添加一个新方法为 overridden on create that sends the confirmation instructions

      【讨论】:

        【解决方案6】:
        【解决方案7】:

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

        【讨论】:

        • 也许延迟是一个糟糕的词选择。我想阻止 Devise 发送电子邮件,但在管理员完成配置新用户记录时有一个发送确认电子邮件的操作。
        猜你喜欢
        • 1970-01-01
        • 2014-01-14
        • 1970-01-01
        • 1970-01-01
        • 2012-04-27
        • 2015-08-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多