Рельсы - разработка, проверка чувствительности к электронной почте
Я использую Devise с учетными данными: email/password - no usernames
Я только заметил, что процесс входа в систему чувствителен к регистру для сообщений электронной почты. поэтому, если вы зарегистрируетесь на [email protected], а затем попробуйте войти в систему с помощью [email protected], вы получите сообщение об ошибке. Очень запутанно.
Как я могу заставить разработчиков регистрировать людей по электронной почте/паролю, а электронное письмо нечувствительно к регистру?
Ответы
Ответ 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
Ответ 5
Придумайте проблему здесь:
https://github.com/plataformatec/devise/wiki/How-To:-Allow-users-to-sign-in-using-their-username-or-email-address