我在Ruby 1.8.7和Rails 2.3.8中有一个哈希:
important_dates = params[:important_dates]
important_dates =#>
{"third_test"=>"July 11, 2014", "fourth_test"=>"August 08, 2014", "second_test"=>"June 13, 2014", "sixth_test"=>"August 05, 2014"}
日期来自我传递日期对象的Rails中的calendar_select_date_tag
,但在params中,当我尝试这样做时,我总是得到一个字符串:
new_dates = important_dates.each_value{|r| r.to_date}
new_dates[:fourth_test].class.inspect #=> String
我已经在这几个小时了。
答案 0 :(得分:3)
new_dates = Hash[important_dates.map{|k,v| [k, v.to_date]}]
或者如果您使用的是Ruby 2.0或更高版本:
new_dates = important_dates.map{|k,v| [k, v.to_date]}.to_h
更新:为什么你的答案不起作用:
each_value
总是返回它迭代的初始哈希,它会丢弃块返回值。请注意,例如:
h = {a: 'foo', b: 'bar'}
h.each_value {|v| v.upcase } #=> upcase creates a new string object
h #=> {a: 'foo', b: 'bar'}
但是,如果值是可变的,您可以尝试在迭代期间更改它:
h = {a: 'foo', b: 'bar'}
h.each_value {|v| v.upcase! } #=> upcase! alters existing string object
h #=> {a: 'FOO', b: 'BAR'}
new_dates = important_dates.each_value {| r | r.to_date}
因为您希望将字符串对象更改为日期对象,所以绝对无法使用each_value
执行此操作。