2010-11-29 2 views
26

私の単純なレーキタスクは、lib/tasks/items_spider.rakeに保存されています。それはItemモデルのspider!となります。Rails 3レーキタスクは生産現場でモデルを見つけることができません

namespace :items do 
    desc "Spider the web for data, hoorah" 
    task :spider => :environment do 
    Item.spider! 
    end 
end 

私は:environmentタスクを依存関係として持っているので、すべてうまく動作します。私はRAILS_ENV=productionを追加するときしかし、私は両方の私のローカルサーバーと本番サーバー上で、エラーをヒット:

$ rake items:spider RAILS_ENV=production --trace 
(in /home/matchu/Websites/my-rails-app) 
** Invoke items:spider (first_time) 
** Invoke environment (first_time) 
** Execute environment 
** Execute items:spider 
rake aborted! 
uninitialized constant Object::Item 
/home/matchu/.rvm/gems/[email protected]/gems/rake-0.8.7/lib/rake.rb:2503:in `const_missing' 
/home/matchu/.rvm/gems/[email protected]/gems/rspec-core-2.0.0.beta.22/lib/rspec/core/backward_compatibility.rb:20:in `const_missing' 
/home/matchu/.rvm/gems/[email protected]/gems/rspec-expectations-2.0.0.beta.22/lib/rspec/expectations/backward_compatibility.rb:6:in `const_missing' 
/home/matchu/Websites/openneo-impress-items/lib/tasks/items_spider.rake:4:in `block (2 levels) in <top (required)>' 
/home/matchu/.rvm/gems/[email protected]/gems/rake-0.8.7/lib/rake.rb:636:in `call' 
[...trace of how rake gets to my task...] 

これだけの私には奇妙に思えます。明らかに、モデルは正しくロードされていません。私はRails 3.0.3を使っていますが、このアプリの開発はRails 3がベータ版になってから始まりました。この問題をデバッグするにはどうすればよいですか?ありがとう!

+0

ここで少し手を伸ばす、しかし、あなたは、コマンドの先頭にRAILS_ENV宣言を移動しようとしましたか? –

+0

@Peer:no go :(ありがとう! – Matchu

+0

'Item'モデルはどこに保管されていますか?通常の場所? –

答えて

43

実稼働環境でアプリケーションを実行するのとは異なり、Rakeタスクはではありません。はコードベース全体を読み込みます。 falseある

module Rails 
    class Application 
    module Finisher 
     # ... 
     initializer :eager_load! do 
     if config.cache_classes && !$rails_rake_task 
      ActiveSupport.run_load_hooks(:before_eager_load, self) 
      eager_load! 
     end 
     end 
     # ... 
    end 
    end 
end 

のでのみ$rails_rake_task場合、アプリケーションは、熱心な仕掛けの生産になります:あなたはthe sourceでそれを見ることができます。 は:environment Rakeタスクでtrueに設定されています。

最も簡単な回避策は、必要なモデルをrequireにすることです。本当には、アプリケーションのすべてのrakeタスクでロードする必要がある場合は、それをロードすることは非常に簡単です:Railsはであなたのモデルをオートロードするため

Rails.application.eager_load! 

すべての開発では、この作業の理由があります開発モード。これはRakeタスク内でも機能します。あなたは以下を追加する必要があり、ご使用の環境/ production.rbで

+0

素敵な探偵作品:D今日後で試してみます。ありがとう! – Matchu

+3

もう少し調査をしましたが、これは私のアプリが実際には発生しなかった生産上のスレッドセーフとしてマークされていることに関係していることが判明しました。その正確な問題にどのように対処するかについてもう少し詳しく見ていきます。ありがとう! – Matchu

+0

$ rails_rake_taskは最近のバージョンのrakeやrailsでは定義されていませんが、Rakefileに '$ rails_rake_task = true'を手動で設定することもできます。 –

37

、:

config.dependency_loading = true if $rails_rake_task 

それは私のために問題を解決しました。

(注意:!これはconfig.threadsafeコールの後に追加する必要があります)

+1

それはなぜ必要なのでしょうか?これはバグのように見えますか? :環境をロードすると、モデルもロードされるはずです – Tilo

+1

レール4には良い方法がありますか? – alex88

+0

$ rails_rake_taskは最近のバージョンのrakeやrailsでは定義されていませんが、Rakefileに '$ rails_rake_task = true'を手動で設定することはできます –

関連する問題