这可能是也可能不是设计错误,但我认为是。
在测试中,我尝试将整数指定为电子邮件地址。我从活动记录保存的“大便”中得到此错误:
=> #<NoMethodError: undefined method `downcase!' for 1:Fixnum>
尽管事实上我在用户上进行了此验证&lt;的ActiveRecord ::基
validates :email, format: { with: /^[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}$/i, message: "Invalid email"}
我猜测某些设计验证或其他钩子正在电子邮件地址上被调用并炸毁。
有人可以对此有所了解吗?谢谢!
答案 0 :(得分:1)
查看Devise源代码:
authenticable
模块添加before_validation :downcase_keys
,其执行以下操作:
def downcase_keys
self.class.case_insensitive_keys.each { |k| apply_to_attribute_or_variable(k, :downcase!) }
end
(参见lib/devise/models/authenticatable.rb以供参考)
在将任何逻辑应用于模型之前,它用于对所有不区分大小写的键进行缩写。默认配置由Devise提供,case_insensitive_keys
包含您使用email
设置的Fixnum
字段。
# Keys that should be case-insensitive.
mattr_accessor :case_insensitive_keys
@@case_insensitive_keys = [ :email ]
(参见lib/devise.rb以供参考)
这样,即使在检查自己的验证之前,也会执行验证。也许可以向Devise添加对变量类型的额外验证,但默认情况下,您只会将登录/等表单提供的String
分配给该字段。
我希望我能澄清一点。