我有一个带设备的用户模型,并有一个活动列,指示用户是否处于活动状态。试用期结束后,除非用户注册其中一项计划,否则帐户将处于非活动状态。
当前,当电子邮件已存在时,我正在使用如下所示的设备向用户显示自定义错误消息
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”
当电子邮件已存在且帐户处于活动状态时,有条件地显示错误消息的正确方法是什么?
处理此问题的方法并不是真正通过验证,因为验证没有您在应用程序流程中所处位置的上下文。
仅仅在表单上显示一个小错误对用户来说比显示一条闪现消息的帮助要小得多。
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
}