Авто / нетерпеливая загрузка каталога за пределами / 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

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


person Basin    schedule 11.10.2020    source источник
comment
Какой набор тестов вы используете? Это rspec или тестовые модульные тесты?   -  person PressingOnAlways    schedule 12.10.2020
comment
Rspec используется для тестирования   -  person Basin    schedule 12.10.2020
comment
какой автозагрузчик вы используете классический или zeitwerk? В rails 6 по умолчанию будет zeitwerk   -  person Kasi Raj R    schedule 12.10.2020
comment
zeitwerk по умолчанию, как говорится в документации Rails 6   -  person Basin    schedule 12.10.2020


Ответы (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 подробнее

person Kasi Raj R    schedule 12.10.2020
comment
Было бы правильно предположить, что платформа загрузки игнорирует каталоги первого уровня, в моем случае, если я хочу иметь пространство имен MyDomain, мне нужно создать какой-то фиктивный каталог и переместить my_domain внутрь него? - person Basin; 12.10.2020
comment
да, именно поэтому ваш файл должен быть в dummy / my_domain / check_record.rb, а dummy должен быть добавлен в путь автозагрузки, если он вам так нужен - person Kasi Raj R; 12.10.2020