次の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 タスクから実行している場合にのみ発生する理由はわかりません。
何か案は?