2016-07-24 54 views
0

我试图找出处理时间字段的最佳方法。我为烹饪应用程序的时间和准备时间做了很多工作,如果我可以允许用户在文本字段中基本写入,然后将其转换为持续时间以存储并使用导轨distance_of_time_in_words函数来显示它。还没有能够找到任何点我在正确的方向为这如何处理在rails应用程序中输入时间

编辑:所以我尝试使用下面的Minutizer但我不断收到

未定义的方法`minutize”慢性:模块

我创建了下面的代码创建一个新模块chronic.rb和我的应用程序保存它/ libs文件夹

然后,我已经包括在我的模型慢性,但我不能得到上述

摆脱错误的
+0

[在Rails模型中使用的持续时间字段(http://stackoverflow.com/questions/1051465/using-a-duration-field-in-a-rails-model) –

回答

1

尝试在慢性宝石本拉入请求 - https://github.com/mojombo/chronic/pull/231

它能够处理下列期限:

  • 一个半钟
  • 半小时
  • 1.5小时
  • &更多

粘贴代码(由https://github.com/TalkativeTree PR)在这里,因为它可能会被删除:

class Minutizer 

    def minutize(text) 
     text = pre_normalize(text) 
     extract_time(text) 
    end 

    def pre_normalize(text) 
     text.gsub!(/half an/, 'a half') 
     text.gsub!(/half a/, 'a half') 
     text = Numerizer.numerize(text.downcase) 
     text.gsub!(/an hour/, '1 hour') 
     text.gsub!(/a hour/, '1 hour') 
     text.gsub!(/a day/, '1 minute') 
     text.gsub!(/a minute/, '1 day') 
     text.gsub!(/a week/, '1 week') 
     # used to catch halves not covered by Numerizer. Use for the conversion of 'an hour and a half' Previous gsubs will have changed it to '1 hour and haAlf' by this point. 
     text.gsub!(/(\d+)\s?\w+?\s?and haAlf/) do |m| 
     m.gsub!(/\A\d+/, ($1.to_f + 0.5).to_s) 
     end 
     text.gsub!(/\s?and haAlf/, '') 
     text.gsub!(/haAlf/, "0.5") 
     text.gsub!(/(seconds|secnds|second|secnd|secs)/, 'sec') 
     text.gsub!(/(minutes|minute|mintues|mintes|mintue|minte)/, 'min') 
     text.gsub!(/(horus|hours|huors|huor|hrs|hr)/, 'hour') 
     text.gsub!(/(days|day|dy)/, 'day') 
     text.gsub!(/(weeks|wks|wk)/, 'week') 
     text 
    end 

    def extract_time(text) 
     minutes = extract(text, 'week') 
     minutes += extract(text, 'day') 
     minutes += extract(text, 'hour') 
     minutes += extract(text, 'min') 
     minutes += extract(text, 'sec') 
    end 

    def extract(text, option) 
     total = text.match(/(\d+.\d+|\d+)\s?(#{option})/) 

     return 0 unless total 
     digitize_time(total[1], option) 
    end 

    def digitize_time(time, option) 
     case option 
     when 'week' 
     multiplier = 7 * 24 * 60 
     when 'day' 
     multiplier = 24 * 60 
     when 'hour' 
     multiplier = 60 
     when 'min' 
     multiplier = 1 
     when 'sec' 
     multiplier = 1.to_f/60 
     end 

     return multiplier * time.to_f 
    end 
    end 

只是保存在某个地方上面的文件,并尝试下面这样:

您还需要安装minutizer工作“numerizer”宝石。

☁ Documents irb 
2.3.0 :001 > require './minutizer.rb' 
=> true 
2.3.0 :002 > require 'numerizer' 
=> true 
2.3.0 :003 > Minutizer.new.minutize('1.5 hours') 
=> 90.0 
2.3.0 :004 > 
+0

Im的可能的复制有一个非常困难的时间搞清楚如何得到这个工作...我从你的github安装了慢性宝石,但它似乎也没有minutizer。我怎样才能覆盖它并将其添加进来。你能否给我快速的步骤,以便我需要在模型文件中调用它。谢谢 – DRing

+0

@DRing更新了答案。你不需要慢性宝石,但你需要的数字宝石 – emaillenin

+0

好,所以下面的工作在我的轨道控制台为我的应用程序。现在我试着将它整合到我的表格中,以便在保存前改变输入 – DRing

相关问题