翻译 关于 case_sensitive 配置项的疑惑,到底是敏感不敏感

coderq · 2016年07月23日 · 最后由 coderq 回复于 2016年07月23日 · 6759 次阅读

最近在用 devise 其中在配置多个标识的时候有个大小写敏感与否的问题,如下:

Be sure to add case insensitivity to your validations on :username:

# app/models/user.rb

validates :username,
  :presence => true,
  :uniqueness => {
    :case_sensitive => false
  } # etc.

Alternatively, change the find conditions like so:

# when allowing distinct User records with, e.g., "username" and "UserName"...
where(conditions).where(["username = :value OR lower(email) = lower(:value)", { :value => login }]).first

描述的事情是大小写不敏感就把 case_sensitive 设置为 false,对吧,但是下面的 sql 却是对username大小写敏感的啊

看了 RubyChina 的源码,设置的是{ case_sensitive: true },也就是大小写敏感,但是实际上 RubyChina 的登录对大小写是不敏感的

def self.find_for_database_authentication(warden_conditions)
    conditions = warden_conditions.dup
    login = conditions.delete(:login)
    login.downcase!
    where(conditions.to_h).where(['lower(login) = :value OR lower(email) = :value', { value: login }]).first
  end

这该如何解释啊,是我脑子一直转不过来弯么,望各位能够指点迷津。。

login.downcase!

#1 楼 @mizuhashi 难道是我问题描述的不够清楚造成了您的误解?我的疑问在:case_sensitive设置项上面的设置与实际的使用方式不太一致。

#2 楼 @coderq 我看错了,首先你一开始贴出来的 validate 和 devise 没关系,他就是约束存到数据库里的数据,必须大小写不敏感地唯一

所以 rubychina 的,你只要关注他存的时候是不是先转小写再存的,登陆的时候查询是先转了小写再查询,所以数据库里只有小写

如果要大小写不敏感,直接按 rubychina 的做是没问题的,按一开始提的方法也没问题,区别只是你的数据库里是纯小写还是大小写都有

#3 楼 @mizuhashi 贴出来的 Devise 的文档是 username 大小写敏感的,我不理解的是为什么它大小写敏感,还要在 validate 里面设置 :case_sensitive 为 false,而 rubychina 的大小写不敏感,却设置为 true,有点晕菜了,能详细说明下吗?XD

#4 楼 @coderq

And if you want email to be case insensitive, you should add 如果你希望 email 对大小写不敏感 ,你应该加上

conditions[:email].downcase! if conditions[:email]
where(conditions.to_h).first

Be sure to add case insensitivity to your validations on :username: 记得为 username 的验证添加 大小写不敏感 选项

# app/models/user.rb

validates :username,
  :presence => true,
  :uniqueness => {
    :case_sensitive => false
  } # etc.
6 楼 已删除

#5 楼 @mizuhashi 是的,这些没问题,问题是设置的 case_sensisive false 却还允许 username UserName 两种大小写敏感的的方式?

需要 登录 后方可回复, 如果你还没有账号请 注册新账号