Рейкс 3 не может найти модель в производстве - PullRequest
26 голосов
/ 29 ноября 2010

Моя простая задача с граблями, хранящаяся в 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, хотя разработка этого приложения началась еще тогда, когда Rails 3 был в бета-версии.Как я могу отладить эту проблему?Спасибо!

Ответы [ 3 ]

43 голосов
/ 30 ноября 2010

В отличие от запуска вашего приложения в рабочей среде, задача 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

Так что только , если $rails_rake_task равно false, приложение будет загружено в производство. И $rails_rake_task установлен в true в задаче :environment Rake.

Самый простой обходной путь - просто require модель, которая вам нужна. Однако если вам действительно нужно, чтобы все ваше приложение было загружено в задаче Rake, загрузить его довольно просто:

Rails.application.eager_load!

Причина всей этой работы в разработке заключается в том, что Rails автоматически загружает ваши модели в режиме разработки. Это также работает из задачи Rake.

37 голосов
/ 03 февраля 2011

В вашей среде / production.rb вы должны добавить следующее:

config.dependency_loading = true if $rails_rake_task

Это решило проблему для меня.

(Примечание: это следует добавить ПОСЛЕ вызова config.threadsafe!)

0 голосов
/ 18 июня 2019

Только что нашел другой: я разрабатывал на windows, развертывал на Heroku.Веб-приложение и консоль rails работали нормально, но не могли загрузить модель rake-задач и даже прямых запросов.Оказалось, что я рассеянно создал файл модели как Model.rb вместо model.rb - зависящая от системы чувствительность к регистру.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...