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

y4ekin9u  于 2023-08-04  发布在  Ruby
关注(0)|答案(5)|浏览(96)

我将Devise设置为使用用户名而不是电子邮件地址登录,因为我们的大量用户与他们的配偶共享相同的电子邮件地址。这是我们服务的独特市场。但夫妻双方都需要单独的账户来记录人格测试结果。
数据库不再需要一个唯一的电子邮件地址,所以它将接受两个帐户相同的电子邮件addy。但是,Devise仍然需要每个帐户的唯一电子邮件地址。是否有一个设置或变通办法,我可以用来改变这一点?

vyswwuz2

vyswwuz21#

·在你的用户模型上使用这些方法(无论是什么模型,都是用Devise挂载的)注意,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

  • 请注意,您正在“monkeypatching”一个私有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
·确保重新实现验证以满足您的需求

kzmpq1sx

kzmpq1sx2#

看看config/initializers/devise.rb。您可以将默认身份验证密钥(默认为:email)更改为您想要的任何内容,例如:
config.authentication_keys = [ :username ]

gz5pxeao

gz5pxeao4#

如果你只想删除devise给出的uniqueness validation而保留其他的,参考this(对于rails >= 4.1.6)。

xxls0lw8

xxls0lw85#

所以,这真的很古老...但我觉得我应该回应一下
我使用的是旧版本的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

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

相关问题