4

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

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

示例:一些家伙将自己命名为 TheFourthMusketeer。

  • 视图将显示 TheFourthMusketeer,而不是 thefourthmusketeer
  • 没有新用户可以注册,比如说,thHEfourthMUSKETEER
4

2 回答 2

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

这样做,aUser.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 。

于 2013-01-25T06:07:48.580 回答
2

接受的答案不完整,因为它在注册时仍然区分大小写。例如,“用户名”和“用户名”都可以成功注册,但只有第一个可以登录。

禁用不区分大小写的键config/initializers/devise.rb(这也可以是特定于模型的,所以也检查那里):

config.case_insensitive_keys = []

覆盖find_first_by_auth_conditions方法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_ofmodels/user.rb

validates_uniqueness_of :username, :case_sensitive => false

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

于 2016-01-26T07:40:18.420 回答