设计 - 如何允许在验证页面上更改未确认的电子邮件(更正)

Devise - how to allow change of unconfirmed email (correction) on verification page

我目前正在实施 Devise Confirmable,以便将用户发送到确认页面 "We've sent a validation email to , check it and click on the link"。

我被要求实现一项功能,允许用户在他们犯错时编辑该电子邮件,并更新和发送验证到新电子邮件。这仅适用于全新帐户,而不适用于其中包含任何数据的现有帐户。

用户在验证之前未登录,我正在向页面发送参数[:uuid],该页面在重新加载时会被擦除 - 这不是执行此操作的好方法。我想我可以使用 localstorage...

以前有人做过吗?

你可以做的是,

例如,

  1. 如果用户收到一封带有 link 的确认邮件,并且他点击了 link,此时您可能会有一个状态列,它会更改状态为 pending.

  2. 现在,您可以允许用户更改他们的电子邮件,直到他们的帐户状态保持 pending。此时,如果用户想返回并更改他的电子邮件,他将收到一封带有 link.

  3. 的确认邮件
  4. 假设我们有 approved 状态,只有在他登录应用程序后,状态才会从 pending 变为 approved

这有帮助吗?

我会在服务器的会话中存储未确认的帐户 ID:session[:unconfirmed_account] = 999。然后,当用户未通过身份验证并且存在 session[:unconfirmed_account] 时,在页面上显示一个通知,其中包含帐户未确认的电子邮件和一个 link 或一个更改它的按钮。

我认为在会话中设置 :unconfirmed_account 变量的最佳方法是覆盖 Devise 的 Devise::RegistrationsController#create 方法。这是创建新的未确认帐户的地方。

class RegistrationsController < Devise::RegistrationsController
  def create
    super do |resource|
      if resource.persisted?
        session[:unconfirmed_account] = resource.id
      end
    end
  end
end

有关如何自定义 Devise 控制器的信息可在此处找到 https://www.rubydoc.info/github/plataformatec/devise#Configuring_controllers

用户确认电子邮件并通过身份验证后,应删除会话变量。

class ConfirmationsController < Devise::ConfirmationsController
  def show
    super do |resource|
      if resource.errors.empty?
        session.delete(:unconfirmed_account)
      end
    end
  end
end

当用户更新未确认的电子邮件时,应更新帐户并将新的确认邮件发送到新的电子邮件地址。这是给你实现的)