哈希不是将日期保存为值?

时间:2014-03-10 16:42:32

标签: ruby-on-rails ruby datetime type-conversion hash

我在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 

我已经在这几个小时了。

1 个答案:

答案 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执行此操作。