【问题标题】:Hash is not saving date as values?哈希没有将日期保存为值?
【发布时间】:2014-04-13 21:48:16
【问题描述】:

我在 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,我将日期对象传递给它,但在参数中,当我尝试这样做时,我总是得到一个字符串:

    new_dates = important_dates.each_value{|r| r.to_date}        
    new_dates[:fourth_test].class.inspect #=> String 

我已经做了好几个小时了。

【问题讨论】:

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


    【解决方案1】:
    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 绝对无法做到这一点。

    【讨论】:

    • @Vimsha 回答中对此进行了解释。 each_value 类似于 each 返回一个它迭代的对象。您的块没有更改任何值 - 它正在根据值创建一个新对象,然后它没有在任何地方分配它,所以它丢失了。
    猜你喜欢
    • 2012-04-20
    • 2011-06-08
    • 2014-08-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-01
    相关资源
    最近更新 更多