Правильный способ оптимизации повторяющегося кода Rails - PullRequest
0 голосов
/ 22 августа 2009

У меня есть приложение Rails с несколькими моделями-представлениями-контроллерами, которые имеют некоторые сходные характеристики, например, 5 разных моделей можно комментировать, голосовать или отмечать, я также активно использую внешние плагины.

На данный момент я представил комментарии, голоса, теги и т. Д. Только к одной модели (и ее представлению и контроллеру). Однако теперь, когда я доволен результатами, я хочу исключить эту общую функциональность из определенного MVC одной модели и разрешить доступ к нему из всех других моделей.

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

1 - Как мне это сделать? Я думал о создании модуля в директории "lib" (это то же самое, что и класс mixin?), А затем о переносе кода многократного использования в общие части. А как насчет кода контроллера?

2 - Поскольку я только изучал Ruby on Rails во время кодирования первой модели, я выбрал, вероятно, неправильный способ добавления нескольких методов в контроллер. У меня есть метод, который добавляет комментарий (addcomment), добавляет голосование (addvote) и т. Д. Все эти методы требуют нестандартной (не RESTful) маршрутизации через: collection. Насколько я понимаю, правильным способом было бы перенести функциональность контроллера комментариев на собственный контроллер и получить доступ по стандартным маршрутам RESTful. Это то, что я должен делать?

3 - Многие плагины (например, act_as_commentable) явно не требуют загрузки модуля, просто строка "act_as_commentable" где-то в модели. Могу ли я использовать что-то подобное для моей общей функциональности? Как это работает?

Ответы [ 2 ]

3 голосов
/ 22 августа 2009
  1. Простой способ - разделить код на модули и использовать mixin. Лучший способ - написать свои собственные плагины для вашего общего кода .. как act_as_commentable Вы можете узнать об этом здесь: http://guides.rubyonrails.org/plugins.html

  2. Правильный способ - создать контроллер комментариев, вложив его в ваши модели и предоставив маршруты отдыха, подобные этому: / mymodelname / 1 / comments. Простой способ сделать такие контроллеры - использовать плагин inherited_resources . прокрутите вниз до раздела «Полиморфизм принадлежит» - есть пример контроллера комментариев

2 голосов
/ 22 августа 2009

Для повторного кода модели поместите его в модуль в каталоге lib.

Для кода контроллера поместите ваш дубликат кода в ApplicationController.

Для кода просмотра используйте партиалы.

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