设计:=&gt; #<nomethoderror:undefined =“”method =“”`downcase!'=“”for =“”1:fixnum =“”> </nomethoderror:>

时间:2013-02-22 19:50:18

标签: ruby-on-rails devise

这可能是也可能不是设计错误,但我认为是。

在测试中,我尝试将整数指定为电子邮件地址。我从活动记录保存的“大便”中得到此错误:

=> #<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"}

我猜测某些设计验证或其他钩子正在电子邮件地址上被调用并炸毁。

有人可以对此有所了解吗?谢谢!

1 个答案:

答案 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分配给该字段。

我希望我能澄清一点。