在Devise中,不区分大小写的名称,同时保留大小写

时间:2013-01-25 05:29:22

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

使用名称作为键,我们如何在注册时通过忽略大小写来验证名称,同时还要记住显示时的大小写?

config/initializers/devise.rb中,在注册之前设置config.case_insensitive_keys = [ :name ]似乎小写整个名称。

示例:一些家伙自称为TheFourthMusketeer。

  • 视图将显示TheFourthMusketeer,而不是thefourthmusketeer
  • 没有新用户可以注册,例如,tHEfourthMUSKETEER

2 个答案:

答案 0 :(得分:6)

您可能会尝试:name设置为不区分大小写,这样可以在数据库中正确保存区分大小写的名称:

config.case_insensitive_keys = []

然后,覆盖User上的find_first_by_auth_conditions类方法,以按名称查找用户。请注意,此代码会因数据库而异(以下是使用Postgres):

def self.find_first_by_auth_conditions(warden_conditions)
  conditions = warden_conditions.dup
  if login = conditions.delete(:login)
    where(conditions).where("lower(name) = ?", login.downcase).first
  else
    where(conditions).first
  end
end

这样做,User.find_for_authentication(login: 'thefourthmusketeer')将使用name“TheFourthMusketeer”正确返回记录。

有关覆盖此方法的说明,请参阅https://github.com/plataformatec/devise/wiki/How-To:-Allow-users-to-sign-in-using-their-username-or-email-address

答案 1 :(得分:1)

接受的答案是不完整的,因为它在注册时仍然区分大小写。例如,'username'和'USERNAME'都可以成功注册,但只有第一个能够登录。

config/initializers/devise.rb中禁用不区分大小写的密钥(这也可以是特定于模型的密钥,因此也请检查):

config.case_insensitive_keys = []

覆盖find_first_by_auth_conditions的{​​{1}}方法:

models/user.rb

...并在def self.find_first_by_auth_conditions(warden_conditions) conditions = warden_conditions.dup if login = conditions.delete(:username) where(conditions).where(["lower(username) = :value", { :value => login.downcase }]).first else where(conditions).first end end 中设置validates_uniqueness_of

models/user.rb

所以你有它:不区分大小写的身份验证,不区分大小写,在数据库中保留大小写。