Rails 3,为什么Model.new会进行隐式转换?

时间:2010-11-23 11:43:16

标签: ruby-on-rails validation ruby-on-rails-3 model

我在rails3模型实例化中遇到了一种奇怪的行为。

所以,我有一个简单的模型:

class MyModel < ActiveRecord::Base
  validates_format_of :val, :with => /^\d+$/, :message => 'Must be an integer value.'
end

然后是一个简单的控制器:

def create
  @mod = MyModel.new(params[:my_model])
  if @mod.save
    ...
  end
end

首先,params[:my_model].inspect返回:

{:val => 'coucou :)'}

但是在致电@mod = MyModel.new(params[:my_model]) ...

之后

现在,如果我打电话给@mod.val.inspect,我会得到:

0

为什么我没有收到原始字符串?

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

这是因为val被定义为数据库中的整数吗?

我如何避免这种行为并让验证完成他的工作?

谢谢:)

2 个答案:

答案 0 :(得分:1)

如果val被定义为模式中的整数,则调用@my_model.val将始终返回一个整数,因为AR进行类型转换。这对于rails 3来说并不陌生,它始终以这种方式工作。如果您想要在控制器中指定原始字符串值,请尝试@my_model.val_before_type_cast。请注意validates_format_of对此类型前的值执行验证,因此您无需在那里指定。

修改

抱歉,我对“在此类型前的值上执行验证”部分提出了错误。查看验证代码,它会在类型转换后的值上调用.to_s,在您的情况下会返回"0",因此会通过验证。

说实话,我建议不要打扰这个验证。如果0不是此列的有效值,则直接验证,否则只需依赖类型转换。如果用户输入123 foo,您最终会在数据库中找到123,这通常很好。

答案 1 :(得分:1)