Rails автозагрузка не загружает модуль - PullRequest
0 голосов
/ 14 января 2019

В моем приложении rails у меня есть пользовательский каталог в app/entities/keycard_generator/

У меня есть data_source.rb (модуль) и register_keycard.rb (класс)

module DataSource
  ...
end

class RegisterKeycard
  include DataSource
...
end

Я добавил эту строку в мой application.rb, чтобы автоматически загрузить путь.

Dir[Rails.root.join('app/entities/keycard_generator/**/*.rb')].each(&method(:require))

Но я получаю следующие ошибки (не могу запустить рельсы):

uninitialized constant RegisterKeycard::DataSource (NameError)

Редактировать

Я думаю, что проблема только с модулями

Ответы [ 2 ]

0 голосов
/ 14 января 2019

Учитывая, что у вас есть:

app/entities/keycard_generator/data_source.rb

Тогда содержимое этого файла, по соглашению, должно быть:

module KeycardGenerator
  module DataSource
    ...
  end
end

Поскольку rails по существу игнорирует имя каталога в app (здесь entities) с точки зрения именования:

app/entities/keycard_generator/data_source.rb
    ^^^^^^^^

Но ожидает, что имя каталога в каталоге в приложении (здесь keycard_generator) будет именем модуля:

app/entities/keycard_generator/data_source.rb
             ^^^^^^^^^^^^^^^^^

И учитывая, что у вас есть:

app/entities/keycard_generator/register_keycard.rb

Тогда содержимое этого файла, по соглашению, должно быть:

module KeycardGenerator
  class RegisterKeycard 
    include DataSource
  end
end

При соблюдении соглашения вам не нужно:

Dir[Rails.root.join('app/entities/keycard_generator/**/*.rb')].each(&method(:require))

Лично мне нравится добавлять тип (здесь обозначенный entities) к файлам и модулям / классам, например:

app/entities/keycard_generator/data_source_entity.rb
module KeycardGenerator
  module DataSourceEntity
    ...
  end
end

Вот как это часто делают рельсы (например, с controller), но не всегда (например, с model).

В этом случае вы также сделаете:

app/entities/keycard_generator/register_keycard_entity.rb
module KeycardGenerator
  class RegisterKeycardEntity
    include DataSourceEntity
  end
end
0 голосов
/ 14 января 2019

Пометить включенный модуль как глобальный, добавив к имени префикс ::

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