设计 - 如何更改设置,以便电子邮件地址不需要是唯一的

时间:2011-08-17 18:53:23

标签: ruby-on-rails ruby ruby-on-rails-3 devise

我设置Devise使用用户名而不是电子邮件地址登录,因为我们的大量用户与他们的配偶共享同一个电子邮件地址。这是我们服务的独特市场。但每个配偶都需要单独的账户来记录个性工具的结果。

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

5 个答案:

答案 0 :(得分:47)

=用户模型

def email_required?
  false
end

def email_changed?
  false
end

=迁移

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 :(得分:15)

查看config/initializers/devise.rb。您可以将默认身份验证密钥更改为:email,默认情况下为{1}},例如:

config.authentication_keys = [ :username ]

答案 2 :(得分:1)

请查看说明here

答案 3 :(得分:0)

如果您只想删除uniqueness validation提供的devise并保留其他rails,请参阅this(适用于[a-z]&gt; = 4.1.6)。

答案 4 :(得分:-1)

所以,这真的很古老......但我想我会回应。

我正在使用旧版本的设计(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

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