Как динамически расширять и добавлять функции в модель / контроллеры / представления Rails - PullRequest
0 голосов
/ 16 апреля 2020

У меня есть продуктивное приложение на 7 лет, которое выросло из Rails 3, и теперь мы переходим на Rails 6. Я говорю это, потому что я думаю, что мы знаем, как работать с Rails. Но, похоже, нам чего-то не хватает. Как правильно расширить поведение объекта?

Моя основная задача c в том, что я хочу разделить приложение на более мелкие гемы, которые должным образом протестированы в разных сборках и не требуют сборки в течение 1 часа. всех функций для всех спецификаций / функций для запуска. Я хочу сохранить определенную функцию на драгоценном камне и, когда драгоценный камень доступен, чтобы подключить эту функцию и сделать ее доступной для пользователей.

Примером является модель под названием Группа. Например, группа может иметь:

users
messages
custom fields

Но функциональность группы растет: мы добавляем больше столбцов в одну таблицу, мы добавляем больше проблем к той же модели, мы добавляем больше Поведение к тому же контроллеру и больше частичных к тому же представлению. Но там нет Dynami c.

Например, метод group_params в контроллере Groups должен иметь значение

params.require(:group).permit(:users_attributes, :messages, :custom_fields_attributes)

И представление должно показывать

render 'users_form_partial'
render 'messages_fields'
render 'custom_fields_attributes'

Но я бы хотел извлечь custom_fields в новый гем. Когда этот драгоценный камень доступен, он должен добавить все необходимые вещи в группу. Отношение к модели, поведение к контроллеру и формы к представлениям.

Так что, если у меня есть custom_fields_gem 1.0.0, это будет

# config/initializers/custom_fields_to_groups.rb

Group.class_eval do
 has_many :custom_fields
end

GroupsController.class_eval do 
 ...how do we modify the group_params method here 
end

... how do we change app/views/groups/_form to now have all the things that it has an custom_fields_form.

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

Как этого достичь? Модификация контроллера и вида.

Полагаю, я мог бы создать новый контроллер GroupCustomFieldsController, который доступен по другому URL-адресу и отвечает только за настраиваемые поля. Но это должно как-то включать взгляды существующей группы. По крайней мере, ссылка для "/ group_custom_fields"

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