代码之家  ›  专栏  ›  技术社区  ›  Matchu

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

  •  26
  • Matchu  · 技术社区  · 14 年前

    我的简单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
    

    我有 :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,不过这个应用的开发是从rails3测试版开始的。如何着手调试此问题?谢谢!

    2 回复  |  直到 14 年前
        1
  •  43
  •   Vijay Dev    14 年前

    与在生产环境中运行应用程序相反,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_task false ,该应用程序是否会被紧急加载到生产环境中。以及 $rails_rake_任务 设置为 true :environment Rake任务。

    最简单的解决方法是 require 你需要的模型。但是,如果你 真正地 需要将所有应用程序加载到Rake任务中,加载它非常简单:

    Rails.application.eager_load!
    

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

        2
  •  37
  •   Mathieu Ravaux    12 年前

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

    config.dependency_loading = true if $rails_rake_task
    

    它为我解决了这个问题。

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

        3
  •  0
  •   Justin Love    5 年前

    刚刚发现另一个:我在windows上开发,部署到Heroku。web应用和rails控制台运行良好,但是rake任务甚至direct require都无法加载模型。结果我心不在焉地创建了模型文件 Model.rb 而不是 model.rb -取决于系统的大小写敏感度。