Mat*_*chu 26 rake ruby-on-rails ruby-on-rails-3
我的简单rake任务存储lib/tasks/items_spider.rake在开发中运行得很好.它所做的就是调用spider!的Item模型.
namespace :items do
desc "Spider the web for data, hoorah"
task :spider => :environment do
Item.spider!
end
end
Run Code Online (Sandbox Code Playgroud)
我把: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/ruby-1.9.2-preview3@rails3/gems/rake-0.8.7/lib/rake.rb:2503:in `const_missing'
/home/matchu/.rvm/gems/ruby-1.9.2-preview3@rails3/gems/rspec-core-2.0.0.beta.22/lib/rspec/core/backward_compatibility.rb:20:in `const_missing'
/home/matchu/.rvm/gems/ruby-1.9.2-preview3@rails3/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/ruby-1.9.2-preview3@rails3/gems/rake-0.8.7/lib/rake.rb:636:in `call'
[...trace of how rake gets to my task...]
Run Code Online (Sandbox Code Playgroud)
这对我来说似乎很奇怪.显然模型没有正确加载.我在Rails 3.0.3上,虽然这个应用程序的开发在Rails 3处于测试版时开始.我该如何调试此问题?谢谢!
mol*_*olf 43
相反,在生产环境中运行应用程序,一个Rake任务确实不急于加载你的整个代码库.你可以在源代码中看到它:
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
Run Code Online (Sandbox Code Playgroud)
所以,只有当$rails_rake_task是false,将应用急于装生产.并$rails_rake_task设置为true在:environmentRake任务.
最简单的解决方法是简单地require使用您需要的模型.但是,如果您确实需要在Rake任务中加载所有应用程序,则加载它非常简单:
Rails.application.eager_load!
Run Code Online (Sandbox Code Playgroud)
所有这些在开发中工作的原因是因为Rails在开发模式下自动加载模型.这也适用于Rake任务.
小智 37
在您的environment/production.rb中,您应该添加以下内容:
config.dependency_loading = true if $rails_rake_task
Run Code Online (Sandbox Code Playgroud)
它解决了我的问题.
(注意:这应该在config.threadsafe!call之后添加)
| 归档时间: |
|
| 查看次数: |
11786 次 |
| 最近记录: |