Rails 3 rake任务在生产中找不到模型

时间:2010-11-29 01:34:32

标签: ruby-on-rails ruby-on-rails-3 rake

我在lib/tasks/items_spider.rake中存储的简单rake任务在开发中运行得很好。它只需在spider!模型上调用Item

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/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...]

这对我来说似乎很奇怪。显然模型没有正确加载。我在Rails 3.0.3上,虽然这个应用程序的开发在Rails 3处于测试阶段时开始。我该如何调试此问题?谢谢!

4 个答案:

答案 0 :(得分:43)

与在生产环境中运行应用程序相反,Rake任务急切加载整个代码库。您可以在the source中看到它:

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_taskfalse,那么,应用程序是否会在生产中急切加载。 $rails_rake_task Rake任务中的true设置为:environment

最简单的解决方法是简单地require您需要的模型。但是,如果确实需要在Rake任务中加载所有应用程序,则加载它非常简单:

Rails.application.eager_load!

所有这些在开发中工作的原因是因为Rails在开发模式下自动加载模型。这也适用于Rake任务。

答案 1 :(得分:37)

在您的environment / production.rb中,您应添加以下内容:

config.dependency_loading = true if $rails_rake_task

它解决了我的问题。

(注意:这应该在config.threadsafe!call之后添加)

答案 2 :(得分:0)

刚发现另一个:我正在Windows上进行开发,并部署到Heroku。 Web应用程序和Rails控制台运行良好,但耙任务甚至直接需求无法加载模型。原来,我已经将模型文件创建为Model.rb而不是model.rb了(取决于系统的区分大小写)。

答案 3 :(得分:0)

在Rails 6.0.3.2中,我也发生了同样的事情。

我尝试配置rake文件task :foo do ... end.,而应该配置task foo: :environment do ... end