Авто / нетерпеливая загрузка каталога вне / app

В приложении Rails (Rails 6) я создал каталог в корне приложения rails - вне /appпапка. Я хочу попытаться сохранить некоторую логику вне веб-фреймворка Rails.

- rails_root
  - app/
    - models/
    - controllers/
  - lib/
    - tasks/
  - my_domain/
    - check_record.rb

файл check_record.rb

module MyDomain
  module CheckRecord
    def self.call(record)

    end
  end
end

Теперь я не могу автоматически загружать этот каталог в среде тестирования (RSpec) и разработки (консоль rails).

Когда я пытаюсь application.rb

config.autoload_paths += %W(#{config.root}/my_domain)

Тесты терпят неудачу из-за неинициализированной константы #Class:0x00007f96e1f1ad90::MyDomain
Получение той же ошибки при попытке доступа к классам в консоли rails

Когда я пытаюсь application.rb

config.paths.add "my_domain", eager_load: true, glob: "**/*.rb"

Я вижу, что все файлы из этой папки регистрируются в Rails.configuration.eager_load_paths, но тесты не проходят с тем же сообщением об ошибке

Когда я перемещаю этот код в выделенный класс инициализатора, тот же вывод или при запуске консольного инициализатора Rails не загружается вообще.

Использование типов доменов:

class MyRecord < ApplicationRecord
  def check
    MyDomain::CheckRecord.call(self)
  end
end

Как я могу загружать или автоматически загружать каталог с файлами ruby ​​вне /app папка?

1 ответ

Решение

Я считаю, что вы используете автозагрузчик zeitwerk, который используется по умолчанию в Rails 6. В этом случае ваш файл check_record.rb должен быть

module CheckRecord
  def self.call(record)

  end
end

И это должно называться так

class MyRecord < ApplicationRecord
  def check
    CheckRecord.call(self)
  end
end

Пожалуйста, обратитесь к https://guides.rubyonrails.org/autoloading_and_reloading_constants.html#project-structure для получения более подробной информации.

Другие вопросы по тегам