Перезагрузите lib файлы без перезапуска dev-сервера в Rails 3.1 - PullRequest
4 голосов
/ 24 марта 2012

У меня есть несколько модулей внутри папки lib в rails, т. Е .:

/ Библиотека / MyApp / Lib / **

Я работаю над ними в разработке, однако каждый раз мне приходится перезагружать сервер. Я прошел через несколько разных вопросов по SO, но большинство из них не для рельсов 3.1

В настоящее время у меня есть инициализатор, который делает это;

if Rails.env == "development"
  lib_reloader = ActiveSupport::FileUpdateChecker.new(Dir["lib/**/*"], true) do
    Rails.application.reload_routes! # or do something better here
  end

  ActionDispatch::Callbacks.to_prepare do
    lib_reloader.execute_if_updated
  end
end

if Rails.env == "development"
  lib_reloader = ActiveSupport::FileUpdateChecker.new(Dir["lib/myapp/lib/*"], true) do
    Rails.application.reload_routes! # or do something better here
  end

  ActionDispatch::Callbacks.to_prepare do
    lib_reloader.execute_if_updated
  end
end

Есть ли общий способ сделать это? Потребуется много времени, чтобы перезапускать сервер каждый раз!

Ответы [ 2 ]

13 голосов
/ 11 апреля 2012

Избавьтесь от инициализатора и в файле application.rb вставьте следующую строку:

config.autoload_paths += Dir["#{config.root}/lib/**/"]

Следует обратить внимание на то, что имена ваших модулей и классов должны следовать соглашению об именах, чтобы автозагрузка работала.например, если у вас есть файл lib / myapp / cool.rb, тогда ваша константа для объявления класса / модуля в cool.rb должна выглядеть так:

Myapp::Cool

Если у вас есть файл lib / myapp / lib /cool.rb и вы хотите, чтобы он использовал Cool в качестве имени класса / модуля вместо Myapp :: Lib :: Cool, тогда ваша автозагрузка должна выглядеть следующим образом:

config.autoload_paths += Dir["#{config.root}/lib/myapp/lib/**/"]

Пока вы работаете в devmode,rails автоматически перезагрузит все классы / модули, которые находятся в пути автозагрузки и следуют соглашениям об именах.

2 голосов
/ 28 октября 2013

Добавить к application_controller.rb или вашему базовому контроллеру:

  before_filter :dev_reload if Rails.env.eql? 'development'

  def dev_reload
    # add lib files here
    ["rest_client.rb"].each do |lib_file|
      ActiveSupport::Dependencies.load_file lib_file
    end
  end

Сработало для меня.

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