railsで、ではなくrubyでclockworkを使ったときにNoMethodErrorが出たのでその対処法
環境
- ruby 2.5.1
- clockwork 2.0.3
簡単な処理を動かしてみます
clock.rb
require 'clockwork'
include Clockwork
def one_minute
p "minutely job"
end
def one_hour
p "hourly job"
end
handler do |job|
self.send(job.to_sym)
end
every(1.minute, 'one_minute')
every(1.hour, 'one_hour')
$ clockwork clock.rb
...
...
/Users/user/hoge/clock.rb:18:in `<module:Clockwork>': undefined method `minute' for 1:Integer(NoMethodError)
と、このようなエラーが
Integerクラスには`minute'なんてメソッドはないよ というエラーなのでActive Supportをいれてあげます。
Active Supportとは
Object、String、Array、Hash、DateといったRubyの基本的なクラスに便利なメソッドを追加してくれるライブラリ
railsにはデフォルトでAcrive Supportが組み込まれているので、blank?メソッドなどが使えます。
対処法
IntegerクラスのminuteメソッドもActive supportが追加してくれるので、gem installしましょう
Gemfile
...
...
gem 'clockwork'
gem 'activesupport'
$ bundle install
requireも忘れずに
clock.rb
require 'clockwork'
#追加
require 'active_support/all'
include Clockwork
...
...
every(1.minute, 'one_minute')
every(1.hour, 'one_hour')
$ clockwork clock.rb
I, [2018-09-22T20:16:47.890148 #14730] INFO -- : Starting clock for 2 events: [ one_minute one_hour ]
I, [2018-09-22T20:16:47.890641 #14730] INFO -- : Triggering 'one_minute'
"minutely job"
I, [2018-09-22T20:16:47.890853 #14730] INFO -- : Triggering 'one_hour'
"hourly job"
I, [2018-09-22T20:17:47.001826 #14730] INFO -- : Triggering 'one_minute'
"minutely job"
上手くいきました