Ruby on rails 为什么Rails 3中的Model.new会进行隐式转换?

Ruby on rails 为什么Rails 3中的Model.new会进行隐式转换?,ruby-on-rails,validation,ruby-on-rails-3,model,Ruby On Rails,Validation,Ruby On Rails 3,Model,我在Rails 3模型实例化中遇到了一个奇怪的行为 因此,我有一个简单的模型: class MyModel < ActiveRecord::Base validates_format_of :val, :with => /^\d+$/, :message => 'Must be an integer value.' end 首先,params[:my_model]。检查返回: {:val => 'coucou :)'} 但是在调用@mod=MyModel.new(

我在Rails 3模型实例化中遇到了一个奇怪的行为

因此,我有一个简单的模型:

class MyModel < ActiveRecord::Base
  validates_format_of :val, :with => /^\d+$/, :message => 'Must be an integer value.'
end
首先,
params[:my_model]。检查返回:

{:val => 'coucou :)'}
但是在调用
@mod=MyModel.new(params[:my_model])
之后

现在,如果我调用
@mod.val.inspect
,我将得到:

0
为什么我没有得到原始字符串

最后验证成功,因为
val
确实是一个整数

这是因为
val
在数据库中定义为整数吗


如何避免此行为并让验证完成其工作?

如果模式中将
val
定义为整数,则调用
@my_model.val
将始终返回一个整数,因为AR执行类型转换。这对rails 3来说并不新鲜,它一直都是这样工作的。如果要在控制器中分配原始字符串值,请在键入前尝试
@my\u model.val\u。请注意,
验证
的\u format\u对该预类型转换值执行验证,因此不需要在此处指定

编辑

抱歉,我对“在此预类型转换值上执行其验证”部分的理解有误。查看验证代码,它调用post-typecast值上的
.to
,在您的情况下,该值返回
“0”
,因此通过验证


老实说,我建议不要为这个验证费心。如果
0
不是此列的有效值,则直接验证该值,否则仅依赖类型转换。如果用户输入
123 foo
,您将在数据库中得到
123
,这通常很好。

还有更适合您的案例的验证器:

0