Що таке інтерактор у Ruby on Rails?

В Ruby on Rails інтерактор — це концепція або паттерн, що дозволяє організувати бізнес-логіку в додатках таким чином, щоб розділити відповідальності та зробити код більш чистим, структурованим і легким для підтримки. Rails за своєю природою використовує паттерн MVC (Model-View-Controller), проте інтерактори додають додатковий шар для більшої гнучкості та чіткості.

Rails зазвичай обробляє бізнес-логіку в моделях або контролерах, однак, коли обробка стає складною, це може призвести до перевантаження і складності підтримки. Тут на допомогу приходять інтерактори — вони дозволяють винести бізнес-логіку за межі контролерів та моделей.

Інтерактор у контексті Rails

У контексті Rails інтерактори часто використовують через гем gem Interactor або створюють власні класи для реалізації подібної функціональності. Метою інтерактора є інкапсуляція логіки одного конкретного бізнес-процесу. Це дозволяє зберігати контролери “тонкими” (Thin Controllers) та моделями, які не перевантажені надмірною логікою.

Використання інтерактора з гемом Interactor:

  1. Спочатку додайте гем в Gemfile:

    gem 'interactor'
    
  2. Потім створіть інтерактор:

    # app/interactors/create_order.rb
    class CreateOrder
      include Interactor
    
      def call
        order = Order.new(context.order_params)
    
        if order.save
          context.order = order
        else
          context.fail!(error: order.errors.full_messages)
        end
      end
    end
    

    У цьому прикладі інтерактор виконує логіку створення замовлення. Якщо замовлення успішно збережене, воно додається в контекст, якщо ні — операція завершується з помилкою.

  3. Використання в контролері:

    class OrdersController < ApplicationController
      def create
        result = CreateOrder.call(order_params: order_params)
    
        if result.success?
          redirect_to result.order, notice: 'Order was successfully created.'
        else
          render :new, alert: result.error
        end
      end
    
      private
    
      def order_params
        params.require(:order).permit(:product_id, :quantity)
      end
    end
    

Переваги використання інтеракторів

  1. Чіткість коду
    Інтерактори дозволяють ізолювати бізнес-логіку в окремі класи, що робить код більш структурованим і легко зрозумілим.
  2. Повторне використання логіки
    Оскільки інтерактори є окремими компонентами, їх можна легко повторно використовувати в різних частинах додатка.
  3. Тестування
    Інтерактори є окремими класами з чітко визначеними вхідними даними і результатами, тому їх легко тестувати.
  4. Тонкі контролери
    Контролери залишаються простими і відповідальними тільки за обробку запитів, а не за складну бізнес-логіку.

Недоліки

  • Додаткова складність може виникнути при використанні великої кількості інтеракторів, особливо в малих проєктах, де це може здаватися зайвим.
  • Не кожен Rails-розробник знайомий з цією концепцією, тому для команди може знадобитися додатковий час на навчання.
1 Вподобання