10410


clockworkで定期処理を実装したのですが、定期処理を開始すると下記のエラーが出ます。  
cronで回していた時は同じコードでもエラーは出ませんでした。

[code]

    I, [2015-05-19T16:10:11.003250 #15901]  INFO -- : Triggering '10.second.job'
    item.rb:1:in `<main>': uninitialized constant Rails (NameError)
    
[/code]

どうすればエラーがでないようになるでしょうか  
ちなみに定期処理は正しく動いていません

※cronであればエラーはでずに正しく定期処理が開始されます。

# lib/tasks/item.rb

[code]

    require "#{Rails.root}/app/models/item"
    
    class Tasks::Item
      def self.item_check
    
        #処理
    
      end
    end
    
[/code]

# config/clock.rb

[code]

    require 'clockwork'
    include Clockwork
    
    every(10.second, '10.second.job') do
      Dir.chdir("../lib/tasks"){ puts `ruby item.rb` }
    
    end
    
[/code]

# cron時の設定 config/schedule.rb gem 'whenever'を使用

[code]

    set :environment, :development
    set :output, {:error => 'log/error.log', :standard => 'log/cron.log'}
    
    
    every 1.minute do
      runner "Tasks::Item.item_check"
    end
    
[/code]


CC BY-SA 3.0
2015-05-19T07:13:42.527
10362
2015-08-30T05:28:16.287
2015-08-30T05:28:16.287
3271
9161
question
ruby-on-rails clockwork
Rails4.2 item.rb:1:in `<main>': uninitialized constant Rails (NameError)


`ruby item.rb`とやっているので。純粋なrubyから実行しています。  
そのためRails環境で起動していないのでRails未定義でエラーとなります。

wheneverの場合は、`runner`で起動していますが。  
これは`rails runner`が起動します。

every(10.second, '10.second.job') do  
Dir.chdir("../lib/tasks"){ puts `ruby item.rb` }

end

<https://github.com/javan/whenever/blob/79e4f66fba8956efe41cf919f623a247f3ef3463/lib/whenever/setup.rb>

`ruby item.rb` ではなく  
`rails runner -e development 'Tasks::Item.item_check'`が正しい記述となります。

※ ところでlib/tasks下ならrake taskで起動すべきじゃないですかね？

## 方法1: rails runner経由で対応する(その1)

config/clock.rb

[code]

    Dir.chdir("../lib/tasks"){ puts `ruby item.rb` }
    ↓
    `rails runner -e development 'require "./lib/tasks/item"; Tasks::Item.item_check'`
    
[/code]

lib/tasks/item.rb

[code]

    class Tasks::Item
    ↓
    class Tasks
      class Item
    
[/code]

## 方法2: rails runner経由で対応する(その2)

config/clock.rb

[code]

    Dir.chdir("../lib/tasks"){ puts `ruby item.rb` }
    ↓
    `rails runner -e development ./lib/tasks/item.rb'
    
[/code]

lib/tasks/item.rb

[code]

    class Tasks::Item
    ↓
    class Tasks
      class Item
    ファイルの最後に、Tasks::Item.item_checkの呼び出しを書く。
    ※ 注意：こういったファイルは、lib/tasksに置くべきファイルではありません。
    
[/code]

## 方法3:(推奨！) rake tasks経由で対応する

config/clock.rb

[code]

    Dir.chdir("../lib/tasks"){ puts `ruby item.rb` }
    ↓
    `rake item:check`
    
[/code]

lib/tasks/item.rake  
`rails g task item check`でひな形が出来る

[code]

    namespace :item do
      desc "TODO"
      task check: :environment do
        # 処理を書く。environmentが指定されているのでapp/modelsのrequireは不要
      end
    end
    
[/code]

lib/tasksの下は、基本的にrakeタスクを、配置する場所です。  
rubyやrunnerから直接呼び出すコードを置くべき場所では、ありません。


CC BY-SA 3.0
2015-05-20T05:59:44.240
10410
2015-05-25T07:49:24.017
2015-05-25T07:49:24.017
8335
8335
10362
answer