ヨージとプログラミング

プログラミング勉強の記録

【Ruby】1.hourなどでNoMethodError (undefined method `hours'になる場合の対応

Paizaをやっててシリーズ

'1.hour'はTimeクラスじゃなかった(衝撃)

Paizaで時刻を扱え問題に出会いました。
そうなると、Timeクラスの計算をすることがあります。
例えば、現在の時間から10分後の時間を表示するとします。↓

now = Time.now
   # => 2020-01-31 00:58:34 +0900

future = now + 10.minites
   # NoMethodError (undefined method `minites' for 10:Integer)

はい、エラーが出ましたね。minitesなど知らんと言われました。 あれ?メソッドがインポートされてないのかな?名著、チェリー本ではTimeクラスは組み込みモジュールと習ったが… っというか、Time.nowはしっかり動いてるしTimeクラスの問題じゃないっぽい

'1.hour'はActiveSupport::Durationクラス

stackoverflow.com

こちら様の記事に答えがありました。
結論から申し上げますと、次のようにすると動きました。

require 'active_support/time'   # 追加

now = Time.now
   # => 2020-01-31 01:08:14 +0900
future = now + 10.minites
   # => 2020-01-31 01:18:14 +0900

どうも私は勘違いしていたらしく、10.minutesとか1.hourはTimeクラスではありませんでした。(反省)

irb(main):> 1.hour.class
=> ActiveSupport::Duration