2013-01-25 84 views
4

使用名称作为关键字时,我们如何在注册时通过忽略大小写来验证名称,同时还记得显示时的情况?不区分大小写的名称,同时保留大小写,在设计中

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

例如:一些老兄自称TheFourthMusketeer。

  • 的意见会显示TheFourthMusketeer,不thefourthmusketeer
  • 没有新用户可以在注册,也就是说,tHEfourthMUSKETEER
+0

第四个火枪手当然是d'Artagnan :) –

回答

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')将正确地与“TheFourthMusketeer”的name返回的记录。

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

+1

谢谢,好主意。一个错误是当多个用户存在相同的字母时,例如第四和第四。我认为这是通过覆盖RegistrationsController#create来检查这种情况来解决的:) –

1

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

禁用不区分大小写键(这也可以是模型专用的,所以检查有太多):

config.case_insensitive_keys = [] 

覆盖的models/user.rbfind_first_by_auth_conditions方法:

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

validates_uniqueness_of :username, :case_sensitive => false 

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