У меня есть продуктивное приложение на 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"