Подтвердить что ты не робот

Рельсы - разработка, проверка чувствительности к электронной почте

Я использую Devise с учетными данными: email/password - no usernames

Я только заметил, что процесс входа в систему чувствителен к регистру для сообщений электронной почты. поэтому, если вы зарегистрируетесь на [email protected], а затем попробуйте войти в систему с помощью [email protected], вы получите сообщение об ошибке. Очень запутанно.

Как я могу заставить разработчиков регистрировать людей по электронной почте/паролю, а электронное письмо нечувствительно к регистру?

4b9b3361

Ответ 1

Один из вариантов заключается в переопределении метода find, используемого при разработке. Что-то вроде:

# User.rb
before_save do
  self.email.downcase! if self.email
end

def self.find_for_authentication(conditions) 
  conditions[:email].downcase! 
  super(conditions) 
end 

Ответ 2

Вы можете легко исправить проблему, как показано ниже.

# config/initializers/devise.rb
Devise.setup do |config|
  config.case_insensitive_keys = [:email, :username]
end

Ответ 3

Я добавил это в свою модель User, чтобы сохранить его с учетом регистра, но не делайте его без учета регистра во время входа:

def self.find_for_database_authentication(conditions = {})
  self.where("LOWER(email) = LOWER(?)", conditions[:email]).first || super
end

Он работает на Героку.

Кстати, это лишь временное исправление, так как проблема была решена, и это будет поведение по умолчанию в Devise 1.2. Подробнее см. этот запрос на растяжение.

Ответ 4

У меня также было некоторое решение, которое делает работу с электронной почтой нечувствительным к регистру для всех контроллеров Devess (функциональность):

class ApplicationController < ActionController::Base
...
...
  prepend_before_filter :email_to_downcase, :only => [:create, :update]
...
...
  private
...
...
  def email_to_downcase
    if params[:user] && params[:user][:email]
      params[:user][:email] = params[:user][:email].downcase
    end
  end
...
...
end

Я знаю, что это не лучшее решение: оно включает в себя другие контроллеры других моделей и выполняет код, который для них не нужен. Но это было просто импровизировано, и оно работает (по крайней мере для меня;)).

Кевин и Андрес, спасибо за ваши ответы. Это действительно хорошие решения и полезны. Я хотел проголосовать за них, но пока у меня недостаточно репутации. Поэтому я просто говорю "спасибо" вам.;)

Подождите Devise 1.2