#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. Мне понравилась идея использования модулей и миксинов (хотя я их не очень хорошо знаю). Я проведу исследование и посмотрю, как это работает. Спасибо за совет