当电子邮件已存在且帐户处于活动状态时设计自定义错误消息

问题描述 投票:0回答:1

我有一个带设备的用户模型,并有一个活动列,指示用户是否处于活动状态。试用期结束后,除非用户注册其中一项计划,否则帐户将处于非活动状态。

当前,当电子邮件已存在时,我正在使用如下所示的设备向用户显示自定义错误消息

en:
  activerecord:
    errors:
      models:
        user:
          attributes:
            email:
              taken: 'This email address has been used already. Please contact support if you would like more access'

但是,有时在试用期内拥有活动帐户的用户会尝试再次注册,在这种情况下,我想显示不同的错误消息,例如“请登录 __sign__in__link”

当电子邮件已存在且帐户处于活动状态时,有条件地显示错误消息的正确方法是什么?

ruby-on-rails devise ruby-on-rails-5
1个回答
0
投票

处理此问题的方法并不是真正通过验证,因为验证没有您在应用程序流程中所处位置的上下文。

仅仅在表单上显示一个小错误对用户来说比显示一条闪现消息的帮助要小得多。

Devise 使这变得相当容易,因为

Devise::RegistrationsController#create
让子类“利用”流程:


class MyRegistrationsController < Devise::RegistrationsController
  def create
    super do
      if has_duplicate_email? && user_is_active?
        flash.now("You seem to already have an account, do you want to #{ link_to(new_session_path, "log in") } instead?")
      end
    end 
  end

  private 

  def has_duplicate_email?
    return false unless resource.errors.has_key?(:email)
    resource.errors.details[:email].any? do |hash|
      hash[:error] == :taken
    end
  end

  def user_is_active?
    User.find_by(email: resource.email)&.active?
  end
end
# routes.rb
devise_for :users, controllers: {
  registrations: :my_registrations
}
© www.soinside.com 2019 - 2024. All rights reserved.