在保存在rails中之前将输入转换为整数

时间:2010-04-21 17:40:55

标签: ruby-on-rails ruby validation

我有一组表示用户生日的选择输入:birthyear,birthmonth和birthday。我想像这样验证birthyear:

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

因此,用户注册时可以至少12年但最多50年。

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

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

1 个答案:

答案 0 :(得分:1)

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

如果无法将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位数。