Una gema para construir interactores funcionales en Ruby on Rails con:
dry-monads
para flujos segurosInteractor
como basedry-validation
para validación automática decontext
MaybeFields
para trabajar con valores opcionales sin nils
bundle add functional_interactor
O si usás gemas locales:
gem 'functional_interactor', path: './functional_interactor'
class RegisterPortalUser < FunctionalInteractor::ApplicationInteractor
def call
user = yield create_user(context.params)
context.user = user
Success(context)
end
end
class RegisterPortalUserSchema
def self.rules
proc do
required(:params).hash do
required(:email).filled(:string)
end
end
end
end
result = RegisterPortalUser.call(params: {...})
result.success? # true
result.user # accede al contexto
result = RegisterPortalUser.call_monadic(params: {...})
case result
in Dry::Monads::Success(ctx)
puts ctx.user
in Dry::Monads::Failure(error)
puts "Falló: \#{error}"
end
call_monadic
devuelve Success(...)
o Failure(...)
, y es ideal para specs, encadenamientos con yield
, o servicios funcionales.
rails generate functional_interactor:interactor MyCoolInteractor
Esto genera:
app/interactors/my_cool_interactor.rb
app/schemas/my_cool_interactor_schema.rb
MIT