Rails - 设计,电子邮件案例不敏感

时间:2010-11-10 19:14:50

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

我正在使用带有登录凭据的Devise:电子邮件/密码 - 没有用户名

我刚注意到登录过程对电子邮件区分大小写。因此,如果您注册bob@apPle.com,然后尝试使用Bob@apple.com登录,则会收到错误消息。非常混乱。

如何使用他们的电子邮件/密码制作设计日志,并且电子邮件不区分大小写?

5 个答案:

答案 0 :(得分:64)

您可以轻松解决以下问题。

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

答案 1 :(得分:10)

一个选项是覆盖devise使用的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 :(得分:5)

我将此添加到我的用户模型中以将其区分大小写,但在登录时使其不区分大小写:

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

适用于Heroku。

顺便说一句,这只是一个临时修复,因为问题已经解决,这将是Devise 1.2的默认行为。有关详细信息,请参阅this pull request

答案 3 :(得分:0)

我还有一些解决方案,使用电子邮件工作对所有Devise控制器(功能)都不区分大小写:

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

答案 4 :(得分:0)