Devise - 如何更改设置以使电子邮件地址不需要唯一

21

我设置了Devise,以便使用用户名而不是电子邮件地址进行登录,因为我们的许多用户与其配偶分享同一个电子邮件地址。这是我们服务的独特市场。但每个配偶需要单独的帐户来记录个性测试结果。

数据库不再需要唯一的电子邮件地址,因此可以接受相同的电子邮件地址用于两个帐户。但是,Devise仍然要求每个帐户具有唯一的电子邮件地址。是否有设置或解决方法可以更改此设置?

5个回答

53
• Jimmy,在你的用户模型上使用这些方法(无论是哪个与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 

请注意,你正在“猴子补丁”私有API,因此Devise可能会在将来更改其方法。务必对此进行充分的测试覆盖,以防止Devise API的变化。
迁移
删除强制唯一性的数据库索引: rails g migration update_index_on_users def up sql = 'DROP INDEX index_users_on_email' sql << ' ON users' if Rails.env == 'production' # Heroku pg ActiveRecord::Base.connection.execute(sql) end
• 确保根据自己的需求重新实现验证。

1
Erik Jacobs在下面所写的内容验证了这种方法,因为他注释掉的验证可以通过email_changed?禁用。我稍微更喜欢Moin Haidar在这里所做的,因为你不需要以这种方式编辑Devise代码。 - semiomant
3
迁移可以是:remove_index :users, :email - Ivo Dancet

15

请查看config/initializers/devise.rb文件。您可以更改默认的身份验证键,该默认值为:email,使其成为您想要的任何内容,例如:

config.authentication_keys = [:username]


我已经做了。但是Devise仍然需要一个唯一的电子邮件地址。不过还是谢谢你的积极性。 - Jay
6
在这种情况下,从模型中移除 :validatable 参数,这样就可以了。如果需要的话,可以添加自己的自定义验证。 - eugen
13
不幸的是,移除:validatable会导致许多其他有用的功能被移除,例如密码验证。在最近的Devise版本中,您还可以在模型中实现email_required?,如果返回false,则将跳过电子邮件验证,请参见https://github.com/plataformatec/devise/pull/545 - malclocke
2
我不想移除validatable,因为那样我们就必须编写所有密码验证。我进行了上述两个更改(在initializers和email_required?方法中设置为false),但它没有起作用。有什么想法吗? - Prem

2

0

如果您只想删除由devise提供的唯一性验证并保留其他验证,请参考this(适用于rails>=4.1.6)。


-1

这个问题很老了...但我想回答一下。

我正在使用一个旧版本的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

这也需要进入数据库并更改电子邮件列上的索引,该索引默认设置为唯一。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接