1

次のRails 3.2.11アプリケーションにこのrakeタスクがありますlib/rake/searches.rb

namespace :searches do
  desc "Start background searches"
  task :start => :environment do
    Rails.logger.info "Starting searches..."
    Campaign.all.each do |c|
      next unless c.recurring?

      Rails.logger.info "Starting searches for campaign '#{c.name}'"
      SearchWorker.enqueue(:campaign_id => c.id, :clear => true)
    end
  end
end

ローカルで実行すると、すべてうまくいきます。本番環境で実行すると、エラーが発生します:

$ bundle exec rake searches:start
rake aborted!
uninitialized constant SearchWorker
/var/apps/web/lib/tasks/searches.rake:9:in `block (3 levels) in <top (required)>'
/var/apps/web/lib/tasks/searches.rake:5:in `block (2 levels) in <top (required)>'
Tasks: TOP => searches:start
(See full trace by running task with --trace)

コンソール セッションにジャンプすると、クラスが正しく自動ロードされていることがわかります。

$ bundle exec rails console
Loading production environment (Rails 3.2.11)
irb(main):001:0> SearchWorker
=> SearchWorker

このワーカーは存在し、application.rb の構成設定にapp/workers追加されます。autoload_paths

# Custom directories with classes and modules you want to be autoloadable.
# config.autoload_paths += %W(#{config.root}/extras)
config.autoload_paths += %W(
    #{config.root}/custom_scripts
    #{config.root}/app/workers
    #{config.root}/app/models/filters
)

したがって、エラーが本番環境でのみ発生し、rake タスクから実行している場合にのみ発生する理由はわかりません。

何か案は?

4

2 に答える 2

1

.rb 拡張子の rake ファイルを作成したようです

lib/rake/searches.rb

に変更してみてください

lib/rake/searches.rake

それはうまくいくはずです

于 2013-01-31T07:39:08.460 に答える
0

これは、:environmentタスクが完了した後、Rails 3.2 の本番環境が完全にロードされていないことが原因です。

明示的に要求する場合SearchWorker

require 'app/workers/search_worker'

タスク ブロックの先頭で動作します。

(自動ロードがこれを行わない理由はわかりません)

于 2013-09-06T23:44:31.193 に答える