我将 Devise 设置为使用用户名而不是电子邮件地址登录,因为我们的大量用户与其配偶共享相同的电子邮件地址。我们服务的市场是一个独特的市场。但配偶双方都需要单独的账户来记录性格测试结果。
数据库不再需要唯一的电子邮件地址,因此它将接受两个帐户的相同电子邮件地址。然而,Devise 仍然要求每个帐户有一个唯一的电子邮件地址。是否有可以用来更改此设置或解决方法?
• Jimmy 这些方法适用于您的用户模型(无论使用 Devise 安装什么模型)请注意,设计唯一性方法只是使用
if:
修饰符定义,因此您所做的只是强制它不运行
适用于 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
请注意,您正在“猴子修补”私有 API,因此 devise 将来可能会更改其方法。确保对此有良好的测试覆盖率,以防止 Devise 的 API 发生变化
迁移
删除强制唯一性的数据库索引: Rails g 迁移 update_index_on_users 确定 sql = '删除索引index_users_on_email' sql << ' ON users' if Rails.env == 'production' # Heroku pg ActiveRecord::Base.connection.execute(sql) end
• 请务必重新实施验证以满足您的需求
查看
config/initializers/devise.rb
。您可以更改默认身份验证密钥,默认情况下为 :email
为您想要的任何内容,例如:
config.authentication_keys = [ :username ]
请在此处找到说明
所以,这真的很旧......但我想我会回应。
我正在使用旧版本的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
这还需要进入数据库并更改电子邮件列上的索引,该索引设置为开箱即用的唯一。