【问题标题】:Devise - how to change setting so that email addresses don't need to be unique设计 - 如何更改设置以使电子邮件地址不需要是唯一的
【发布时间】:2023-04-03 15:01:01
【问题描述】:

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

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

【问题讨论】:

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


    【解决方案1】:

    = 用户模型

    def email_required?
      false
    end
    
    def email_changed?
      false
    end
    
    # For ActiveRecord 5.1+
    def will_save_change_to_email?
      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
    

    【讨论】:

    • Erik Jacobs 在下面写的内容验证了这种方法,因为email_changed? 可以禁用他注释掉的验证。我稍微喜欢 Moin Haidar 在这里所做的,因为您不需要以这种方式编辑设计代码。
    • 迁移可以是:remove_index :users, :email
    【解决方案2】:

    查看config/initializers/devise.rb。您可以将默认身份验证密钥(默认为 :email)更改为您想要的任何值,例如:

    config.authentication_keys = [ :username ]

    【讨论】:

    • 我已经这样做了。设计仍然需要一个唯一的电子邮件地址。不过感谢您的倡议。
    • 在这种情况下,从模型中删除 :validatable 就可以了。如果需要,添加您自己的自定义验证。
    • 不幸的是,删除 :validatable 会删除许多其他有用的东西,例如密码验证。在最新版本的 Devise 中,您还可以在模型上实现 email_required?。如果返回false,这将跳过电子邮件验证,请参阅github.com/plataformatec/devise/pull/545
    • 我不想删除可验证的,因为,然后我们必须编写所有的密码验证。我做了上面提到的两个更改(在初始化程序和 email_required? 方法中设置为 false),但它没有工作。有什么想法吗?
    【解决方案3】:

    请查找说明here

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        【解决方案5】:

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

        我使用的是旧版本的 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
        

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-09-02
          • 1970-01-01
          相关资源
          最近更新 更多