Структура Rails, я должен использовать сервисный уровень в этом случае? - PullRequest
3 голосов
/ 03 мая 2011

Я новичок в Ruby и Rails, и я делаю свое первое приложение.По сути, я анализирую HTML и отправляю его как JSON клиенту.

В настоящее время у меня есть два источника данных HTML, но в будущем их может быть больше.Из-за этого я подумал, что было бы неплохо удалить код, отвечающий за анализ HTML-кода из контроллера, и поместить его на уровень службы.Я придумал такую ​​структуру:

  • приложение
    • контроллеры
      • main_controller.rb
    • модель
      • project.rb
      • task.rb
    • services
      • source1_service.rb
      • source2_service.rb

MainController вызывает обе службы для получения проектов и задач;каждая служба разбирает свой собственный HTML.

Это хорошее решение?Есть ли более RoR способ сделать это?

Ответы [ 2 ]

3 голосов
/ 03 мая 2011

В отличие от мира Java, концепция «классов сервисного уровня» не очень популярна / не используется в мире RoR. Хорошей идеей будет удалить этот код из ваших контроллеров (вы хотите, чтобы ваши контроллеры были тонкими). Но я думаю, что вы можете внедрить их в свои модели. Если вам кажется, что он становится слишком сложным, вы можете разбить свой дополнительный код на модули и смешать эти модули с вашими моделями.

Это не единственный способ сделать что-то.

Однако, если синтаксический анализ HTML включает некоторую распространенную логику, которую можно использовать повторно, даже в другом проекте хорошей идеей будет поместить его в папку lib /.

3 голосов
/ 03 мая 2011

поместите ваши сервисы в каталог моделей, нет правила, что все модели должны расширяться от ActiveRecord::Base, но ваши сервисы являются непрозрачными моделями данных для остальной части вашего приложения (если я вас правильно понимаю). В идеале, пусть сервисный код имитирует активную запись, чтобы другие люди, которые просто используют ваш код модели, не знали, что она отличается от любой другой модели в вашем приложении rails.

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