2016-07-24 7 views
0

時間フィールドを処理する最善の方法を見つけようとしています。私は時間を調理し、レシピアプリの準備時間を持っています。私は仕事をしていますが、ユーザが基本的にテキストフィールドに書き込むことを許可して、それを選択してから保存してからレールを使用するように変換できるようにしたい場合はdistance_of_time_in_wordsそれを表示する機能。 haventは、このレールアプリの時間入力を処理する方法

EDITのために正しい方向に私を指すように何かを見つけることができた。だから、下のMinutizerを使用しようとしているが、私は慢性のため

未定義のメソッド `minutize」得続けるイム:モジュール

私はその後、私は私のモデルで慢性を含める必要がありますが、私は

上記のエラーを取り除くカント以下のコードで新しいモジュールchronic.rbを作成し、私のアプリ/ libsのフォルダに

それを保存

+0

[レールモデルにおけるデュレーションフィールドを使用する]の可能な重複(http://stackoverflow.com/questions/1051465/using-a-duration-field-in-a-rails-model) –

答えて

1

慢性宝石で、このプルリクエストをお試しください - https://github.com/mojombo/chronic/pull/231

を次の期間を処理することができます:

  • 1分半
  • 時間半
  • 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 

ちょうどどこかに上記のファイルを保存し、この下にしてみてください:あなたはまた、必要

「を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 > 
+0

イム本当に苦労して、これをどうやって稼働させるのかを考えてみました...私はあなたのギブスから慢性の宝石をインストールしましたが、それにはミニチュアが入っているようです。どのように私はそれを上書きし、それを追加することができます。私はモデルファイルでこれを呼び出すために必要なものをすばやく教えてください。ありがとう – DRing

+0

@ DRingは答えを更新しました。あなたは慢性の宝石は必要ありませんが、あなたはnumerizer gem – emaillenin

+0

ok sweetが必要なので、それは私のアプリのための私のレールコンソールで働いた。今では病気を私のフォームに統合して保存する前に入力を変更するようにしてください – DRing

関連する問題