我设置了Devise,以便使用用户名而不是电子邮件地址进行登录,因为我们的许多用户与其配偶分享同一个电子邮件地址。这是我们服务的独特市场。但每个配偶需要单独的帐户来记录个性测试结果。
数据库不再需要唯一的电子邮件地址,因此可以接受相同的电子邮件地址用于两个帐户。但是,Devise仍然要求每个帐户具有唯一的电子邮件地址。是否有设置或解决方法可以更改此设置?
我设置了Devise,以便使用用户名而不是电子邮件地址进行登录,因为我们的许多用户与其配偶分享同一个电子邮件地址。这是我们服务的独特市场。但每个配偶需要单独的帐户来记录个性测试结果。
数据库不再需要唯一的电子邮件地址,因此可以接受相同的电子邮件地址用于两个帐户。但是,Devise仍然要求每个帐户具有唯一的电子邮件地址。是否有设置或解决方法可以更改此设置?
if:
修饰符简单地定义,所以你要做的就是强制它不运行。
适用于Devise 4.2.1或更低版本
def email_required?
false
end
def email_changed?
false
end
对于 Devise 4.3.0 或更高版本
def will_save_change_to_email?
false
end
请查看config/initializers/devise.rb
文件。您可以更改默认的身份验证键,该默认值为:email
,使其成为您想要的任何内容,例如:
config.authentication_keys = [:username]
:validatable
会导致许多其他有用的功能被移除,例如密码验证。在最近的Devise版本中,您还可以在模型中实现email_required?
,如果返回false
,则将跳过电子邮件验证,请参见https://github.com/plataformatec/devise/pull/545 - malclocke这个问题很老了...但我想回答一下。
我正在使用一个旧版本的devise(1.4.9),但是通过freenode上#rubyonrails的帮助,我发现你必须编辑lib/devise/models/validatable.rb文件:
module Devise
module Models
module Validatable
# All validations used by this module.
VALIDATIONS = [ :validates_presence_of, :validates_uniqueness_of, :validates_format_of,
:validates_confirmation_of, :validates_length_of ].freeze
def self.included(base)
base.extend ClassMethods
assert_validations_api!(base)
base.class_eval do
validates_presence_of :email, :if => :email_required?
# commented out so that we don't check for unique emails
#validates_uniqueness_of :email, :case_sensitive => (case_insensitive_keys != false), :allow_blank => true, :if => :email_changed?
validates_format_of :email, :with => email_regexp, :allow_blank => true, :if => :email_changed?
validates_presence_of :password, :if => :password_required?
validates_confirmation_of :password, :if => :password_required?
validates_length_of :password, :within => password_length, :allow_blank => true
end
end
end
end
end
email_changed?
禁用。我稍微更喜欢Moin Haidar在这里所做的,因为你不需要以这种方式编辑Devise代码。 - semiomantremove_index :users, :email
。 - Ivo Dancet