В Ruby on Rails інтерактор — це концепція або паттерн, що дозволяє організувати бізнес-логіку в додатках таким чином, щоб розділити відповідальності та зробити код більш чистим, структурованим і легким для підтримки. Rails за своєю природою використовує паттерн MVC (Model-View-Controller), проте інтерактори додають додатковий шар для більшої гнучкості та чіткості.
Rails зазвичай обробляє бізнес-логіку в моделях або контролерах, однак, коли обробка стає складною, це може призвести до перевантаження і складності підтримки. Тут на допомогу приходять інтерактори — вони дозволяють винести бізнес-логіку за межі контролерів та моделей.
Інтерактор у контексті Rails
У контексті Rails інтерактори часто використовують через гем gem Interactor
або створюють власні класи для реалізації подібної функціональності. Метою інтерактора є інкапсуляція логіки одного конкретного бізнес-процесу. Це дозволяє зберігати контролери “тонкими” (Thin Controllers) та моделями, які не перевантажені надмірною логікою.
Використання інтерактора з гемом Interactor:
-
Спочатку додайте гем в
Gemfile
:gem 'interactor'
-
Потім створіть інтерактор:
# 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
У цьому прикладі інтерактор виконує логіку створення замовлення. Якщо замовлення успішно збережене, воно додається в контекст, якщо ні — операція завершується з помилкою.
-
Використання в контролері:
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
Переваги використання інтеракторів
- Чіткість коду
Інтерактори дозволяють ізолювати бізнес-логіку в окремі класи, що робить код більш структурованим і легко зрозумілим. - Повторне використання логіки
Оскільки інтерактори є окремими компонентами, їх можна легко повторно використовувати в різних частинах додатка. - Тестування
Інтерактори є окремими класами з чітко визначеними вхідними даними і результатами, тому їх легко тестувати. - Тонкі контролери
Контролери залишаються простими і відповідальними тільки за обробку запитів, а не за складну бізнес-логіку.
Недоліки
- Додаткова складність може виникнути при використанні великої кількості інтеракторів, особливо в малих проєктах, де це може здаватися зайвим.
- Не кожен Rails-розробник знайомий з цією концепцією, тому для команди може знадобитися додатковий час на навчання.