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

问题描述 投票:0回答:5

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

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

ruby-on-rails ruby ruby-on-rails-3 devise
5个回答
53
投票

• 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

• 请务必重新实施验证以满足您的需求


15
投票

查看

config/initializers/devise.rb
。您可以更改默认身份验证密钥,默认情况下为
:email
为您想要的任何内容,例如:

config.authentication_keys = [ :username ]


2
投票

0
投票

如果您只想删除

uniqueness validation
给出的
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

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

© www.soinside.com 2019 - 2024. All rights reserved.