Rails 5.2 Сервисные объекты с не текущим пользователем - PullRequest
0 голосов
/ 24 января 2019

Я пытаюсь переслать действие другому контроллеру с помощью методологии сервисных объектов в rails 5.2.

Действие create должно передавать идентификатор пользователя для действия create, но мне не удается передать этот параметр соответствующим образом.

Бизнес-логика заключается в следующем: пользователь сдает в аренду актив, потенциальный арендатор делает запрос, когда владелец актива соглашается на посещение, арендный пользователь создается как клиент в другом контроллере для организации посещения.

Я пытаюсь выполнить действие создания в клиентском контроллере следующим образом:

В контроллере аренды:

private

 def visit(room, rent)
   @newclient = NewclientService.create(params)
   if @newclient.save
   rent.Approved!
   ...
  else
  rent.Declined!
  ...
end

, а затем в приложении / услуге /newclient_service.rb

module NewclientService
  class << self
    def create(params)
      @rent = Rent.find_by(id: params[:id])
      user = @rent.user_id
      name = @rent.user.fullname
      email = @rent.user.email
      Client.create(user_id: user, name: name, email: email)
    end
  end
end

Этот код выполняет свою работу.БД заполнена, проверки и сильные параметры, кажется, работают, и мне кажется, что они достаточно надежны / безопасны.

Вопрос: является ли маршрут объекта службы (мой путь?) Наиболее предпочтительным способом пересылки этого действия?

Спасибо за помощь,

1 Ответ

0 голосов
/ 24 января 2019

Мне нравится шаблон в принципе, и он действительно очистил приложения, которые я создаю. Есть пара замечательных жемчужин, которые я обычно использую для выполнения работы и поддержания чистоты контроллеров.

Я использую мутации gem и simple_command . Эти два вместе дают вам хороший (почти полностью) непротиворечивый API. В частности, гем mutations - это то, что я использую для переваривания и разрешения входных данных JSON из параметров, которые затем могут обрабатывать процессы для меня.

Это хороший шаблон в том смысле, что он очень хорошо инкапсулирует логику дискретной функциональности. Например, если у вас есть мутация RegisterUser, вы можете использовать ее в контроллере или использовать ее для переваривания целого списка объектов и т. Д. Вы даже можете использовать опцию построителя для атрибутов для обработки глубоко вложенного json.

Я бы порекомендовал проверить это.

https://github.com/cypriss/mutations

В тех случаях, когда я не обрабатываю JSON из API и хочу создать дискретную инкапсулированную функциональность, я обычно использую simple_command https://github.com/nebulab/simple_command. Этот подход также хорош, поскольку он позволяет использовать одни и те же компоненты из любого контекст. Например, команда с именем GetLatestTweets.call() может использоваться с контроллера одинаково хорошо, как с REPL.

Обе эти библиотеки предоставляют вам объект результата, который затем можно обработать соответствующим образом

def create
  outcome = NewClientMutation.run(params.require(:resource).permit!)
  if outcome.success?
     render json: outcome.result, status: :created
  else
     render json: {resource: outcome.result, errors: outcome.errors}, status: :unprocessable_entity 
  end
end

В моем конкретном случае я использую «разрешение!» поскольку библиотека мутаций игнорирует любые параметры, которые не указаны явно, это означает, что сильные параметры не нужны, если вы используете эту библиотеку, поскольку она также фильтрует параметры.

...