Ruby on rails 为什么Rails 3中的Model.new会进行隐式转换?
我在Rails 3模型实例化中遇到了一个奇怪的行为 因此,我有一个简单的模型: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(
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