我在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
被定义为数据库中的整数吗?
我如何避免这种行为并让验证完成他的工作?
谢谢:)
答案 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)