0

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

在测试中,我尝试分配一个整数作为电子邮件地址。我从活动记录保存的“肠道”中收到此错误:

=> #<NoMethodError: undefined method `downcase!' for 1:Fixnum>

尽管我的User < ActiveRecord::Base.

validates :email, format: { with: /^[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}$/i, message: "Invalid email"}

我猜想以某种方式在电子邮件地址上调用了一些设计验证或其他钩子并炸毁了。接下来我可以尝试什么?

4

1 回答 1

1

看看设计源代码:

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以供参考)

这样,验证甚至在您自己的验证被检查之前执行。也许可以将变量类型的附加验证添加到设计中,但默认情况下,您只会将String登录 / 等表单提供的分配给该字段。

我希望我能澄清一下。

于 2013-02-23T11:08:22.817 回答