使用设计4.3.0,devise.setup中的注释如下:
# Configure which authentication keys should be case-insensitive.
# These keys will be downcased upon creating or modifying a user and when used
# to authenticate or find a user. Default is :email.
config.case_insensitive_keys = [:email]
我们注意到,下降(下降(发生在模型的validate
期间。在validate
中出现这样的数据更改副作用是出乎意料的(在某些情况下,它会导致大小写混合的电子邮件按原样保存到数据库中(。这意味着如果跳过验证(例如(,则不应用递减
user.save!
<--电子邮件已下移user.save(validate: false)
<--该电子邮件是而不是下降的user.update_attribute(:email, "UPPERCASE@test.com")
<--电子邮件是而不是向下的(因为update_attribute跳过验证(
我搜索过https://github.com/heartcombo/devise对于case_insensitive_keys
,看看是否记录了在validate
上应用降频的事实,以及在最近的版本中是否仍然如此,并且还没有发现任何内容。
参数";case_incitive_keys";在最近的设计版本中,在validate
期间对密钥进行下变频,如果没有,是哪个版本修复了这一问题,现在下变频在哪个阶段完成(还有没有在Rails中不应用设计对密钥的下变频的上下文(?
在撰写本文时,遵循@engineersmnky的注释,设计在before_validation
期间向下键。自2011年以来,它一直在这样做(在修复此问题之前,是before_save
(。
当跳过验证时,before_validation
不会运行,正如其他人所指出的(例如,这里和这里(,这可能导致设计允许在数据库中重复密钥,例如电子邮件(例如,User@test.com
和user@test.com
(,即使配置具有config.case_insensitive_keys = [:email]
。
跳过验证的情况可能多于问题中列出的两种情况。这个谷歌搜索可以提供一个起点,找出哪种类型的代码会导致跳过验证。