Разве в Rails мы не должны создавать сервисный уровень вместо того, чтобы смешивать логику с контроллером? - PullRequest
9 голосов
/ 17 ноября 2010

Скажем, у меня есть контроллер, который возвращает список пользователей.Пользователи должны быть возвращены из memcache, если ключ кеша существует, в противном случае нажмите mysql db.Эта логика будет использоваться повторно, скажем, на уровне веб-службы или что-то в этом роде.

action:

def list

  if in cache
     @userlist = ...
  else
     @userlist = User.all()
  end

end

В мире Java вы создадите слой UserService, который обернет дополнительную логику (как первая проверка уровня кэша и т. д.).

В рельсах люди склонны помещать всю эту логику в контроллер.

Какая здесь «лучшая практика» Rails?

Ответы [ 4 ]

15 голосов
/ 03 января 2011

Похоже, в сообществе Rails наблюдается "небольшое" движение к созданию сервисного уровня в некоторых проектах / приложениях.В 2010 году я работал над проектом, в котором мы ввели каталог приложений / сервисов для хранения сервисных объектов.Мы обнаружили, что логика приложения была распределена по контроллерам и моделям, и это помогло инкапсулировать такое поведение.У Джеймса Голика есть интересный пост на эту тему.Просмотрите также комментарии Пэта Мэддокса:

http://jamesgolick.com/2010/3/14/crazy-heretical-and-awesome-the-way-i-write-rails-apps.html

9 голосов
/ 17 ноября 2010

"Путь Rails" - это: тощие контроллеры, толстые модели.

Вы можете просто изменить модель для поддержки кеша:

class User < ActiveRecord::Base
  def self.all
    @cached[:all] ||= super
  end
end

Или создать инжектор для поддержки кеша.Вы хотите для нескольких моделей:

class User < ActiveRecord::Base
  include CacheInjector
end

Помните: Ruby, как динамический язык, очень легко расширить.Смеси, перехватчики, аспекты, все те вещи, которые PITA для реализации в Java, очень просты и естественны для Ruby.Попробуйте.

4 голосов
/ 21 февраля 2013

В наши дни есть больше точек зрения на эту тему, например:

http://blog.carbonfive.com/2012/01/10/does-my-rails-app-need-a-service-layer/

http://rubysource.com/ddd-for-rails-developers-part-1-layered-architecture/

Мой совет по умолчанию - следовать принципам ООП,Храните вещи простыми, не нарушайте SRP и создавайте значимые абстракции.

2 голосов
/ 17 ноября 2010

Почему бы не выполнить эту проверку в модели и просто вызвать функцию модели из вашего контроллера.Жирные модели и узкие контроллеры

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