我有一个表格,我的用户可以在我的网站上注册。
他们以生日,出生月和生日的形式填写他们的出生日期。
所以我使用Range在这样的表单中创建选择:
= f.select(:birthmonth, options_for_select((1..12)))
但是这并没有像我想要的那样以零开始单位数字:01,02,03,04,05,06,07,08,09,10等等。
我甚至试过这个,但它不起作用:
= f.select(:birthmonth, options_for_select((01..12)))
任何知道如何让Range开始使用前导零的人?或者任何其他方式这样做,以便我可以在验证中使用它?:
validates_inclusion_of :birthmonth, :in => 1..12
答案 0 :(得分:16)
问题在于数字本身没有前导零(或者,有一些永远不会打印的无限数量的前导零)。要获得前导零,您需要字符串。幸运的是,Ruby内置了这种字符串格式化功能。
= f.select(:birthmonth, options_for_select((1..12).map {|n| "%02d" % n}))
%02d
是格式化说明符,表示“如果它少于两位数,则用前导零填充它。”
要进行验证,您需要进行相同的转换:
validates_inclusion_of :birthmonth, :in => (1..12).map {|n| "%02d" % n}
(感谢@ r-dub指出那个位。)
答案 1 :(得分:14)
您实际上可以这样做:'01'..'12'
答案 2 :(得分:2)
如果它只是一个表达问题,您可以构建[text,value]对并将它们传递给options_for_select:
给定一个容器,其中元素响应第一个和最后一个(例如一个双元素数组),“lasts”用作选项值,“firsts”用作选项文本。
所以,比如:
options_for_select((1..12).map {|n| ["%02d" % n, n]})
这样你就可以保持验证逻辑不变。
答案 3 :(得分:2)
使用rjust会让我更容易,更漂亮:
(1..12).collect{ |i| i.to_s.rjust(2,'0') }
答案 4 :(得分:0)
尝试填充小于10的数字,如下所示:
= f.select(:birthmonth, options_for_select((1..12).collect{ |i| i < 10 ? "0#{i}" : i }))