Как заставить Rails 3 перезагружать классы STI в режиме разработки?

После перехода на Rails 3 я заметил, что мне приходится перезагружать сервер, чтобы классы моделей STI перезагружались при каждом запросе. Например, предположим, что у меня есть это:

# app/models/vehicle.rb
class Vehicle < ActiveRecord::Base
end

# app/models/car.rb
class Car < Vehicle
end

Если я внесу изменение в Vehicle, изменение будет загружено при следующем запросе. Но если я внесу изменения в Car, мне придется перезагрузить сервер, чтобы он загрузился.

Любые идеи по исправлению этого?

Я использую WEBrick, но я не привержен этому.


person rlkw1024    schedule 05.01.2011    source источник


Ответы (3)


Мы обнаружили, что нам нужно как решение zetetic, так и дополнительный код, чтобы это работало (по крайней мере, в Rails 3.0.9). Для вышеуказанной проблемы решение будет выглядеть примерно так:

В config/environments/development.rb:

  config.after_initialize do
    ["vehicle"].each do|dep|
      require_dependency( (Rails.root + "app/models/#{dep}").to_s )
    end
  end

В приложении/контроллеры/application_controller.rb:

class ApplicationController < ActionController::Base
  if Rails.env == 'development'
    require_dependency( (Rails.root + "app/models/vehicle").to_s )
  end
...

Код в development.rb обрабатывает начальную загрузку класса, а код в ApplicationController обрабатывает последующие запросы.

person Andrew H    schedule 13.07.2011

Я считаю, что это можно решить, добавив require_dependency 'vehicle' в контроллер.

person zetetic    schedule 10.01.2011
comment
Я считаю, что require_dependency является частью частного API. Также мне кажется, что в этом нет необходимости, так как STI и автозагрузка теоретически поддерживаются из коробки. Я надеюсь, что есть какое-то решение, которое включает глобальную конфигурацию или исправление моего сервера разработки. - person rlkw1024; 11.01.2011
comment
Я согласен, что это не должно быть необходимо, но это так. У STI есть несколько особенностей, требующих обходных путей — это один из них. - person zetetic; 11.01.2011

Используя рельсы 3.0.3 и пассажира 3, я вообще этого не вижу. Если обновление вашего приложения до версии 3.0.3 не помогло, я бы отказался от WEBrick.

Я лично рекомендую использовать что-то другое, кроме WEBrick. Passenger уже давно является моим сервером для разработки и производства.

person BM5k    schedule 27.01.2011
comment
определенно не связанный с сервером ... единорог и тонкий здесь ... рельсы 3.0.9 похожие проблемы ... - person todd; 07.07.2011