2012-03-22 34 views
7

当我运行Heroku Bamboo时,这从来都不是问题。现在,在Cedar上,每当我尝试从服务器上的rake任务中访问我的模型时,都会收到错误。这发生在rake db:seed,一个标准的rake任务,以及我自己定制的任务中,明确包括:环境。我甚至这样做冗余:生产耙子任务不识别我的模型

namespace :db do 
    desc "Update db" 
    task :new_seed => :environment do 
    require './Scraped_Data/Games/code/column-headers.rb' 
    require 'csv' 
    require 'net/http' 
    require './config/environment.rb' 

    # code here... 

    end 
end 

我找不到任何其他地方提到这个问题,所有这些任务在开发中完美运行。感谢您的任何见解,这里是完整的错误消息rake任务尽快吐出来,因为他们遇到雷在Heroku上的模型:

rake aborted! 
uninitialized constant Object::Movie 
/app/vendor/bundle/ruby/1.9.1/gems/rake-0.9.2.2/lib/rake/ext/module.rb:36:in `const_missing' 
/app/lib/tasks/new_seed.rake:187:in `block in load_scraped_data' 
/app/vendor/bundle/ruby/1.9.1/gems/rest-open-uri-1.0.0/lib/rest-open-uri.rb:37:in `open' 
/app/vendor/bundle/ruby/1.9.1/gems/rest-open-uri-1.0.0/lib/rest-open-uri.rb:37:in `open' 
/app/lib/tasks/new_seed.rake:148:in `load_scraped_data' 
/app/lib/tasks/new_seed.rake:550:in `block (2 levels) in <top (required)>' 
/app/vendor/bundle/ruby/1.9.1/gems/rake-0.9.2.2/lib/rake/task.rb:205:in `call' 
/app/vendor/bundle/ruby/1.9.1/gems/rake-0.9.2.2/lib/rake/task.rb:205:in `block in execute' 
/app/vendor/bundle/ruby/1.9.1/gems/rake-0.9.2.2/lib/rake/task.rb:200:in `each' 
/app/vendor/bundle/ruby/1.9.1/gems/rake-0.9.2.2/lib/rake/task.rb:200:in `execute' 
/app/vendor/bundle/ruby/1.9.1/gems/rake-0.9.2.2/lib/rake/task.rb:158:in `block in invoke_with_call_chain' 
/usr/local/lib/ruby/1.9.1/monitor.rb:201:in `mon_synchronize' 
/app/vendor/bundle/ruby/1.9.1/gems/rake-0.9.2.2/lib/rake/task.rb:151:in `invoke_with_call_chain' 
/app/vendor/bundle/ruby/1.9.1/gems/rake-0.9.2.2/lib/rake/task.rb:144:in `invoke' 
/app/vendor/bundle/ruby/1.9.1/gems/rake-0.9.2.2/lib/rake/application.rb:116:in `invoke_task' 
/app/vendor/bundle/ruby/1.9.1/gems/rake-0.9.2.2/lib/rake/application.rb:94:in `block (2 levels) in top_level' 
/app/vendor/bundle/ruby/1.9.1/gems/rake-0.9.2.2/lib/rake/application.rb:94:in `each' 
/app/vendor/bundle/ruby/1.9.1/gems/rake-0.9.2.2/lib/rake/application.rb:94:in `block in top_level' 
/app/vendor/bundle/ruby/1.9.1/gems/rake-0.9.2.2/lib/rake/application.rb:133:in `standard_exception_handling' 
/app/vendor/bundle/ruby/1.9.1/gems/rake-0.9.2.2/lib/rake/application.rb:88:in `top_level' 
/app/vendor/bundle/ruby/1.9.1/gems/rake-0.9.2.2/lib/rake/application.rb:66:in `block in run' 
/app/vendor/bundle/ruby/1.9.1/gems/rake-0.9.2.2/lib/rake/application.rb:133:in `standard_exception_handling' 
/app/vendor/bundle/ruby/1.9.1/gems/rake-0.9.2.2/lib/rake/application.rb:63:in `run' 
/app/vendor/bundle/ruby/1.9.1/gems/rake-0.9.2.2/bin/rake:33:in `<top (required)>' 
/app/vendor/bundle/ruby/1.9.1/bin/rake:19:in `load' 
/app/vendor/bundle/ruby/1.9.1/bin/rake:19:in `<main>' 
Tasks: TOP => db:new_seed 
+1

我怀疑这是失败的原因不同。特别是如果你运行“heroku运行控制台”可以加载“电影”那里? – 2012-03-22 19:11:28

+0

是的,我可以。从控制台访问我的所有模型我没有问题。我刚刚重新检查,并且电影从'heroku run console'正常工作。 – 2012-03-22 19:13:48

+2

我有'线程安全! = true'在我的生产环境中配置。这导致了这个问题。 – 2012-03-22 20:48:13

回答

20

默认线程设置dependency_loading =假
如果你想使你的应用程序线程,并访问您的模型在你的任务中,你需要加载它。

# Enable threaded mode 
config.threadsafe! 
config.dependency_loading = true if $rails_rake_task 


参考:http://nowhereman.github.com/how-to/rails_thread_safe/

希望这有助于!

+0

'$ rails_rake_task'在最近版本的rake或rails中不再定义,但是您仍然可以在Rakefile中手动设置'$ rails_rake_task = true'。 – 2014-11-19 18:28:09