Internal attributes
Internal private attributes can be added via the internal method.
Usage
The assignment and use of internal service attributes is done through the internals=/internals methods.
class UsersService::Create < ApplicationService::Base
input :first_name, type: String
input :middle_name, type: String
input :last_name, type: String
internal :full_name, type: String
output :user, type: User
make :assign_full_name
make :create!
def assign_full_name
internals.full_name = [
inputs.first_name,
inputs.middle_name,
inputs.last_name
].join(" ")
end
def create!
outputs.user = User.create!(full_name: internals.full_name)
end
endOptions
You can find out more about options in the using options section.
Helpers
Servactory allows you to add custom helpers for project purposes.
By "helper" we mean some shorthand spelling that, when used, expands into a specific option.
Custom
Custom helpers can be added using the internal_option_helpers method in configuration.
Such helpers can be based on existing options.
Example with must
class PaymentsService::Create < ApplicationService::Base
# ...
internal :invoice_numbers,
:must_be_6_characters,
type: Array,
consists_of: String
# ...
endMethods
Method only
If necessary, you can filter internals using the only method. This will return a Hash with the specified attributes.
outputs.full_name =
internals.only(:first_name, :middle_name, :last_name)
.values
.compact
.join(" ")Method except
If necessary, you can filter internals using the except method. This will return a Hash without the specified attributes.
outputs.full_name =
internals.except(:gender)
.values
.compact
.join(" ")Predicate methods
Any internal attribute can be accessed as a predicate method.
# ...
internal :full_name, type: String
# ...
def something
return unless internals.full_name? # instead of `internals.full_name.present?`
# ...
end