Как мне организовать пространство имен классов в app / modules с помощью rails? - PullRequest
3 голосов
/ 15 марта 2012

[Это дополнительный вопрос к " Как я могу модулировать модель Rails? "]

Есть ли способ организовать классы в app/models каталоге Rails? Нужно ли использовать одно пространство имен верхнего уровня для всех классов?

Первоначальная мотивация: я хочу поместить классы бизнес-логики, которые не наследуются от ActiveRecord::Base, в каталог app/models. Поиск по этому сайту дает много ответов, которые рекомендуют размещать классы бизнес-логики в каталоге app/models. Я разместил другой вопрос и получил рекомендацию, что такие классы можно поместить в каталог lib.

Теперь мне любопытно. Я хотел бы поместить эти классы в другое пространство имен и каталог в каталог apps/models, который рекомендован другими. Возможно ли это?

На самом деле, я экспериментирую с этим, но мне кажется, что это то, что рельсы не ожидаются. Если я создаю такой класс (например, SomeModName :: ClassInMod в some_mod_name / class_in_mod.rb), он не загружается. Также я определил константы внутри модуля. Поскольку они не загружены, я не могу их использовать. На самом деле, с rspec он работает без проблем, но с rails server класс не загружается. Я уверен, что это связано с проблемой автозагрузки.

В дополнение к классам, упомянутым выше, классы, унаследованные от ActiveRecord::Base, могут быть помещены в некоторые пространства имен внутри module. Мне любопытно, хорошо это работает или нет.

Итак, вопрос другими словами: могу ли я порадовать рельсы, настроив эти файлы для загрузки, или не так, как спроектированы рельсы?

1 Ответ

6 голосов
/ 15 марта 2012

Да, вы можете определить класс ActiveRecord в модуле. Самый простой способ - использовать генератор:

./script/rails generate model logic/phase_logic
./script/rails generate model logic/evaluation_logic

Обратите внимание, что Rails создаст дополнительно файл с определением модуля. В этом случае:

# app/models/logic.rb
module Logic
  ...
end

# app/models/logic/phase_logics.rb
class Logic::PhaseLogic < ActiveRecord::Base
  ...
end

# app/models/logic/evaluation_logics.rb
class Logic::EvaluationLogic < ActiveRecord::Base
  ...
end

Ваши проблемы с константами, определенными в модуле, были вызваны тем фактом, что вы определили константы в модуле определения, «обернутые» вокруг только одной модели из двух созданных вами. Очень важная часть в понимании ruby ​​(и Rails) - , особенно для людей, имеющих большой опыт работы с компилируемыми языками - это помнить, что нет фазы компиляции , поэтому определение Класс читается и выполняется только тогда, когда этот конкретный класс используется. Иногда в неделю после запуска сервера приложений и обслуживания тысяч запросов.

Таким образом, как я уже сказал в ответе на предыдущий вопрос , проблема с автозагрузкой заключалась в том, что иногда определение констант читалось после определения, которое пыталось использовать их. Порядок был случайным - если первым использованным объектом оказался EvaluationLogic, то возникла ошибка. Если первым объектом оказался PhaseLogic, все было хорошо.

Теперь, когда у вас есть файл для самого модуля и определяют константы в этом файле (app/models/logic.rb), автозагрузка сможет найти и выполнить определения до того, как какой-либо класс начнет их использовать. , Я надеюсь, что все будет хорошо.

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