Пропустить проверку электронной почты в Devise - PullRequest
10 голосов
/ 09 февраля 2012

В Devise Validatable модуль содержит validates_uniqueness_of :email, :allow_blank => true, :if => :email_changed? Как отключить этот валидатор?

Ответы [ 4 ]

14 голосов
/ 10 июля 2014

За Разработка собственной документации для модуля Validatable ...

Validatable создает все необходимые проверки для электронной почты пользователя и пароля. Это необязательно, если вы, возможно, захотите сами создать проверки. Автоматическая проверка, если электронное письмо присутствует, уникально и его формат действителен. Также проверяет наличие пароля, подтверждения и длины.

Смелость моя.

Вы должны отключить модуль Validatable и проверить свои собственные проверки.

devise :database_authenticatable, :registerable, :rememberable,
       :trackable, :timeoutable, :confirmable, :recoverable, :lockable
       # :validatable <-- this one needs to go

Просмотрите содержимое lib/devise/models/validatable.rb и перетащите соответствующие разделы в свой собственный класс пользователя. Для текущей версии 3.2.x она должна выглядеть примерно так ...

class User < ActiveRecord::Base

  # From Devise module Validatable
  validates_presence_of   :email, if: :email_required?
  validates_uniqueness_of :email, 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

  # [ ... ] The rest of your model stuff

  protected

  # From Devise module Validatable
  def password_required?
    !persisted? || !password.nil? || !password_confirmation.nil?
  end

  # From Devise module Validatable
  def email_required?
    true
  end

end

Затем внесите необходимые изменения.

Реальный сценарий: я использую Paranoia gem в ряде проектов, которые не будут работать с этим модулем. Поэтому я удаляю его и настраиваю проверку уникальности электронной почты следующим образом: *

validates_uniqueness_of :email, scope: :deleted_at
3 голосов
/ 09 февраля 2012

Боюсь, что вы найдете это очень некрасиво, но:

В версии 1.x (мы говорим о ветке 1.x, верно?) Вариантов выбора нет, поэтомуостается только один способ - удалить ненужные валидаторы в определении класса после директив devise:

class Пользователь расширяет Mongoid документ (без материи, AR здесь тот же, просто поместите класс AR Validator в метод delete_if ниже) и содержит deviseинициализаторы, так что, похоже, этот хак работает:

User._validators[:email].try{ |validators|
  validators.delete_if{ |validator|
    validator.is_a? Mongoid::Validations::UniquenessValidator
  }
}

Итак, определение класса пользователя может быть:

class User
  include Mongoid::Document
  devise :database_authenticatable, :registerable, :validatable
  _validators[:email].try{ |validators|
    validators.delete_if{ |validator|
      validator.is_a? Mongoid::Validations::UniquenessValidator
    }
  }
  # ...
end
2 голосов
/ 23 марта 2018

В зависимости от ваших потребностей, вам может не потребоваться полностью отрывать модуль Validatable.Если вы просто хотите разрешить пустые строки в столбце электронной почты, вы можете переопределить метод email_required? ...

class User
...
def email_required?
  false
end
0 голосов
/ 20 июня 2019

В модели (например, Пользователь), которую вы создали для устройства:

class User
  # devise :database_authenticatable, .... :validatable
  def email_required?
    false
  end

  ## for ActiveRecord < 5.1
  def email_changed?
    false
  end

  ## for ActiveRecord 5.1+
  def will_save_change_to_email?
    false
  end

end

Не забудьте запустить миграцию, чтобы удалить индекс по электронной почте:

def change
  sql = 'DROP INDEX index_users_on_email ON users'
  ActiveRecord::Base.connection.execute(sql)
end

Примечание: Devise проверяет электронную почту, даже если для authentication_keys установлено другое значение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...