如何在rails app中处理持续时间输入

时间:2016-07-24 23:15:12

标签: ruby-on-rails

我试图找出处理时间字段的最佳方法。我有一个烹饪时间和准备时间的食谱应用我正在努力,如果我可以允许用户基本上写在文本字段,但他们选择,然后将其转换为存储的持续时间,然后使用rails {我希望它{3}}显示它的功能。还没有能找到任何指示我正确的方向

编辑:所以我试着使用下面的Minutizer,但我一直在

  

未定义的方法`minutize' for Chronic:Module

我使用下面的代码创建了一个新模块chronic.rb并将其保存在我的app / libs文件夹中

然后我在我的模型中包含Chronic但我无法摆脱上面的错误

1 个答案:

答案 0 :(得分:1)

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

能够处理以下时间:

  • 一分半
  • 半小时
  • 1.5小时
  • &安培;更多

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

  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

只需将上述文件保存在某处,然后尝试以下操作:

您还需要' numerizer'宝石安装为minutizer工作。

☁  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 >