Структура Rails, должен ли я использовать сервисный уровень в этом случае?

#ruby #ruby-on-rails-3

#ruby #ruby-on-rails-3

Вопрос:

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

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

  • приложение
    • контроллеры
      • main_controller.rb
    • Модель
      • project.rb
      • task.rb
    • Услуги
      • source1_service.rb
      • source2_service.rb

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

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

Ответ №1:

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

Ответ №2:

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

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

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

Комментарии:

1. Мне понравилась идея использования модулей и миксинов (хотя я их не очень хорошо знаю). Я проведу исследование и посмотрю, как это работает. Спасибо за совет