Interactor gem
Let’s do a quick review.
What is an Interactor?
An interactor is a simple, single-purpose object.
Interactors are used to encapsulate your application’s business logic.
Each interactor represents one thing that your application does.
Context
An interactor is given a context. The context contains everything the interactor needs to do its work.
When an interactor does its single purpose, it affects its given context.
Let’s get started!
gem "interactor", "~> 3.0"
Implementation
Here, we’re setting up something like steps of interactors to follow.
Here we’re using OrderInit and AddLog interactors, that means our flow will follow this chain.
class AddOrder
include Interactor::Organizer
organize OrderInit, AddLog
end
On the controller level, let’s call our AddOrder organizer and pass order_params as a parameter.
def create
@order = Order.new(order_params)
result = AddOrder.call(order_params)
return render status: :bad_request, json: result.error unless result.success?
render status: :ok, json: result.order
end
Well, easy part: OrderInit should contain call method which uses context as parameter.
Let’s add simple validations here (we can call fail on context).
class OrderInit
include Interactor
def call
context.fail!(error: 'Please add title') if context[:title].empty?
order = Order.create(title: context[:title], total_price: context[:total_price])
context.fail! unless order.valid?
context.order = order
end
end
Last step is AddLog interactor, here we just showing log message for the order, using context.
class AddLog
include Interactor
def call
Rails.logger.info("ADDING ORDER WITH TOTAL PRICE: #{context[:total_price]}")
end
end
That’s it! Easy and simple.