Автоматическое создание конечных точек API и их базовая документация по чванству

Rails настолько волшебен, что мне нужна помощь человека, который знает его немного лучше меня.

Поскольку у меня есть много грубых базовых конечных точек API, повторяющихся снова и снова, я решил автоматизировать их создание (см. мой последний пост в следующем ошибка github).

Ради того, чтобы иметь некоторую базовую действительную документацию по чванству, я также автоматизировал создание Grape::Entities, добавив некоторый пользовательский код в мою ApplicationRecord (см. Фрагмент РЕШЕНИЯ github, добавленный к этому вопросу: Наследование определения класса от родительского класса).

С помощью двух вышеуказанных настроек я могу создать конечную точку API, просто выполнив:

V1::Base.show Book

Приведенный выше метод создаст конечную точку и будет использовать автоматически созданную сущность, например, чтобы она автоматически документировалась со значениями по умолчанию, которые при необходимости можно переопределить позже в классе модели Book:

Book::Entity

Существует 1 исключение, когда приведенный выше код кажется неработающим: кажется, что всякий раз, когда я взаимодействую в раннем состоянии во время начальной загрузки моего приложения Rails (например, инициализаторы), когда я вызываю V1::Base.show Book (для создания конечной точки API), который вызывает Book::Entity возвращается следующая ошибка:

NameError: uninitialized constant Book::Entity

Кто-нибудь может подсказать, что это может быть? раннее взаимодействие с моделью может быть простым Book.all, это пахнет тредом.


person Francesco Meli    schedule 21.11.2017    source источник
comment
На самом деле это больше похоже на проблему с автозагрузкой, чем на проблему с потоком. На самом деле я недавно создал очень похожую концепцию для шаблонов конечных точек в Grape, к сожалению, код слишком многословен и специфичен для приложения, чтобы публиковать его здесь. При этом зачем вам нужно вызывать это в инициализаторе? Почему бы не обрабатывать генерацию необходимых конечных точек ленивым методом или непосредственно внутри V1::Base?   -  person engineersmnky    schedule 21.11.2017
comment
Генерация конечной точки действительно является статическим методом в V1::Base. Это генерация Grape::Entity, которая создается при наследовании ApplicationRecord: причина, по которой я сделал это, заключается в том, что я хотел, чтобы сущность определялась как Model::Entity и Model::EntitiesList. Считаете ли вы, что использование Grape::Entity в качестве подкласса модели является плохим подходом?   -  person Francesco Meli    schedule 21.11.2017
comment
Поскольку я ненавижу идею какой-либо бизнес-логики или логики представления в модели (или ее подклассе), я разделяю две проблемы и динамически генерирую сущности в их собственном пространстве имен. Хотя в нашей кодовой базе есть много проблем, упрощенная версия — это всего лишь Entities::Book = Class.new(Grape::Entity) { expose *Book.attribute_names}. Кажется, эту концепцию можно легко исправить непосредственно в вашем методе #show, поскольку вы уже проверяете определения констант.   -  person engineersmnky    schedule 21.11.2017
comment
Я думаю, что ваша основная проблема сейчас заключается в том, что Book не загружено и, следовательно, Book::Entity недопустимо, потому что Book в настоящее время не является допустимым пространством имен. Если бы вы сделали это в инициализаторе, вам, по сути, нужно было бы загрузить каждую модель (которая обычно лениво загружается по мере необходимости), чтобы у вас было объявленное пространство имен, в котором можно сгенерировать класс Entity. Для постоянного поиска требуется диаграмма глубины, где class Book; class Entity; end; end; может разрешить пространство имен Book, но class Book::Entity; end; не может Хорошая, достаточно краткая статья   -  person engineersmnky    schedule 22.11.2017
comment
На самом деле я смог заставить его работать, это был вопрос константы, еще не созданной и связанной с правильным классом. Теперь, хотя я более согласен с тем, что вы сказали, я тоже очень ненавижу вход в презентацию в модели. Думаю сделать рефакторинг.   -  person Francesco Meli    schedule 22.11.2017
comment
Рад, что у тебя все наладилось. Удачи   -  person engineersmnky    schedule 22.11.2017