rails: файлы автозагрузки внутри каталога lib движка

Я работаю над этим приложением rails с движком, который является своего рода вспомогательным приложением, добавляющим еще несколько маршрутов к моему существующему приложению.

Концепция настолько мощная, благодаря рельсам.

Но я столкнулся с этой странной проблемой, связанной с автозагрузкой изменений файлов в каталоге lib моего движка в режиме разработки. Каждый раз, когда я вношу изменения в каталог приложения движка, будь то модель или контроллер, он работает безупречно, но никакие изменения в файлах в каталоге lib не принимаются. Как я могу это сделать? Спасибо за вашу помощь.


person Sameer    schedule 22.05.2016    source источник


Ответы (3)


Согласно Rails :: Engine docs, вы можете автоматически загружать такие пути, как:

class MyEngine < Rails::Engine
  # Add a load path for this specific Engine
  config.autoload_paths << File.expand_path("../lib/some/path", __FILE__)

  initializer "my_engine.add_middleware" do |app|
    app.middleware.use MyEngine::Middleware
  end
end

Если вы не хотите выполнять автозагрузку, вы можете напрямую потребовать файл в своем классе с помощью оператора require -

require 'my_engine/my_object'
class MyModel < AR::Base
  ...
end

Это будет работать, потому что ваш движок уже загружен в ваше приложение, поэтому вы можете получить доступ к библиотекам внутри него.

person Swaps    schedule 28.04.2017
comment
Предлагаемый File.expand_path (../ lib / some / path, FILE) дает - person J Edward Ellis; 06.02.2020
comment
Из того, что я могу сказать, 3 строки кода, касающиеся промежуточного программного обеспечения, не применимы к вопросу OP (они являются лишь частью более широкого обсуждения конфигурации в документации). Все, что мне нужно (Rails 5), - это настроить autoload_paths. Также стоит отметить, что, поскольку мои файлы lib находились в той же папке, что и engine.rb, мой путь был просто . для ../lib/some/path. - person davew; 29.02.2020

Согласно Rails :: Engine docs, вы можете автоматически загружать такие пути, как:

class MyEngine < Rails::Engine
  # Add a load path for this specific Engine
  config.autoload_paths << File.expand_path("../lib/some/path", __dir__)

  initializer "my_engine.add_middleware" do |app|
    app.middleware.use MyEngine::Middleware
  end
end

Это дает "my_engine / lib / my_engine / lib / some / path"

class MyEngine < Rails::Engine
  # Add a load path for this specific Engine
  config.autoload_paths << "#{config.root}/lib/some/path"

  initializer "my_engine.add_middleware" do |app|
    app.middleware.use MyEngine::Middleware
  end
end

Это дает "my_engine / lib / some / path"

person J Edward Ellis    schedule 06.02.2020

Поместите следующий код в свой config/application.rb

config.eager_load_paths += ["#{Rails.root}/lib"]

Если вы хотите, чтобы это происходило только в режиме разработки, используйте следующие

config.eager_load_paths += ["#{Rails.root}/lib"] if Rails.env.development?
person Alex K Jose    schedule 22.05.2016
comment
Речь идет о rails engine, а не о полной rails app. - person Swaps; 28.04.2017