2010-04-21 75 views
2

我有一组代表用户生日的选择输入:birthyear,birthmonth和birthday。我想验证birthyear这样的:在保存到rails中之前将输入转换为整数

validates_inclusion_of :birthyear, :in => Date.today.year-50..Date.today.year-12 

所以用户可以在至少12年,但,当他们正在注册最多50年。

我的问题是,从输入变量是一个字符串,而不是一个整数。

那么如何将输入转换为整数?有没有更简单的方法来检查用户的年龄?

+0

您是否收到验证错误,此规则或者一些其他错误? api文档显示验证一个年龄段,没有提到需要任何转换。 – Corey 2010-04-21 18:38:07

回答

1

听起来像您已将birthyear db列定义为字符串。 Rails将在分配时将inut参数转换为适当的类型。因此user.new(params[:user])将在保存birthyear的类型中定义购买db列类型。

如果你不能在数据库列更改为整数,然后尝试创建有效的字符串数组。

validates_inclusion_of :birthyear, 
    :in => (Date.today.year-50..Date.today.year-12).map(&:to_s) 

现在,考虑到光秃秃的,在生产中,模型类可以得到缓存,你可以有日期范围,直到你重新启动是错误的,新的一年的情况。

我会在验证函数中添加它,而不是使用包含验证来防止这种情况。现在

def validate 
    current_year = Date.today.year 
    if birthyear && (birthyear.to_i <= current_year - 50 || birthyear.to_i >= current_year - 12) 
    errors.add(:birthyear, "must be between 12 and 50 years of age") 
    end 
end 

,这一切假设未来在输入一个4位数字的一年。

+0

神,你在哪里吧,铁轨将其转换为整数。如果它是在分贝,只是交换和测试。谢谢!我感到很愚蠢。 – Lisinge 2010-04-21 18:49:30

+0

不需要感到愚蠢。 Rails会* *很多在幕后,很容易迷路时,你希望的东西不起作用。 – 2010-04-21 18:52:17

+0

它确实,这是伟大的,但你会觉得你必须自己做,所以你做简单的事情做真的很难。我认为这是来自PHP的一个诅咒 – Lisinge 2010-04-21 18:59:52