Использование опций в атрибутах
Опция type input internal output
Эта опция является валидацией. Будет проверять чтобы переданное значение соответствовало указанному типу (классу). Используется метод is_a?.
Всегда обязательно для указания. Должно содержать один или несколько классов.
class NotificationsService::Create < ApplicationService::Base
input :user, type: User
input :need_to_notify, type: [TrueClass, FalseClass]
# ...
endclass NotificationsService::Create < ApplicationService::Base
# ...
internal :inviter, type: User
# ...
endclass NotificationsService::Create < ApplicationService::Base
# ...
output :notification, type: Notification
# ...
endОпция required input
Эта опция является валидацией. Будет проверять чтобы переданное значение не было пустым. Используется метод present?.
По умолчанию required имеет значение true.
class UsersService::Create < ApplicationService::Base
input :first_name,
type: String
input :middle_name,
type: String,
required: false
input :last_name,
type: String
# ...
endОпция default input
Эта опция не является валидацией. Будет назначать значение для атрибута, если оно не было передано в сервис.
class UsersService::Create < ApplicationService::Base
# ...
input :middle_name,
type: String,
required: false,
default: "<unknown>"
# ...
endОпция as input
Эта опция не является валидацией. Будет указывать новое имя атрибута для работы внутри сервиса. Исходное имя внутри сервиса станет недоступным.
class NotificationsService::Create < ApplicationService::Base
input :user,
as: :recipient,
type: User
# ...
def create!
outputs.notification =
Notification.create!(recipient: inputs.recipient)
end
endОпция inclusion input internal (^2.2.0) output (^2.2.0)
INFO
Начиная с версии 2.12.0 эта опция является динамической.
Эта опция является валидацией. Эта опция является динамической. Будет проверять чтобы переданное значение находилось в указанном массиве. Используется метод include?.
class EventsService::Send < ApplicationService::Base
input :event_name,
type: String,
inclusion: %w[created rejected approved]
# ...
endclass EventsService::Send < ApplicationService::Base
# ...
internal :event_name,
type: String,
inclusion: %w[created rejected approved]
# ...
endclass EventsService::Send < ApplicationService::Base
# ...
output :event_name,
type: String,
inclusion: %w[created rejected approved]
# ...
endОпция consists_of input (^2.0.0) internal (^2.0.0) output (^2.0.0)
INFO
Начиная с версии 2.6.0 эта опция является динамической.
Эта опция является валидацией. Эта опция является динамической. Будет проверять чтобы каждое значение в коллекции соответствовало указанному типу (классу). Проверяет вложенные значения. Используется метод is_a?.
Работает только с типами Array и Set. Вы можете добавить собственный тип через конфигурацию collection_mode_class_names.
Явное применение этой опции необязательно. По умолчанию установлено значение String.
input :ids,
type: Array,
consists_of: Stringinternal :ids,
type: Array,
consists_of: Stringoutput :ids,
type: Array,
consists_of: StringОпция schema input (^2.0.0) internal (^2.0.0) output (^2.0.0)
INFO
Начиная с версии 2.12.0 эта опция является динамической.
Эта опция является валидацией. Эта опция является динамической. Требует значение в виде хеша, которое должно описывать структуру значения атрибута.
Работает только с типом Hash. Вы можете добавить собственный тип через конфигурацию hash_mode_class_names.
Явное применение опции необязательно. Если значение схемы не указано, то валидация будет пропущена. По умолчанию значение не указано.
input :payload,
type: Hash,
schema: {
request_id: { type: String, required: true },
user: {
type: Hash,
required: true,
first_name: { type: String, required: true },
middle_name: { type: String, required: false, default: "<unknown>" },
last_name: { type: String, required: true },
pass: {
type: Hash,
required: true,
series: { type: String, required: true },
number: { type: String, required: true }
}
}
}internal :payload,
type: Hash,
schema: {
request_id: { type: String, required: true },
user: {
type: Hash,
required: true,
first_name: { type: String, required: true },
middle_name: { type: String, required: false, default: "<unknown>" },
last_name: { type: String, required: true },
pass: {
type: Hash,
required: true,
series: { type: String, required: true },
number: { type: String, required: true }
}
}
}output :payload,
type: Hash,
schema: {
request_id: { type: String, required: true },
user: {
type: Hash,
required: true,
first_name: { type: String, required: true },
middle_name: { type: String, required: false, default: "<unknown>" },
last_name: { type: String, required: true },
pass: {
type: Hash,
required: true,
series: { type: String, required: true },
number: { type: String, required: true }
}
}
}Каждый ожидаемый ключ хеша должен быть описан в таком формате:
{
request_id: { type: String, required: true }
}Допускаются следующие опции: обязательные type, required и опциональные default, prepare. Опции default и prepare доступны только при использовании внутри input.
Если в type также указывается значение Hash, то можно описать вложенность в таком же формате.
Опция must input internal (^2.2.0) output (^2.2.0)
Эта опция является валидацией. Позволяет создавать собственные валидации.
class PaymentsService::Create < ApplicationService::Base
input :invoice_numbers,
type: Array,
consists_of: String,
must: {
be_6_characters: {
is: ->(value:, input:) { value.all? { |id| id.size == 6 } }
}
}
# ...
endclass EventsService::Send < ApplicationService::Base
# ...
internal :invoice_numbers,
type: Array,
consists_of: String,
must: {
be_6_characters: {
is: ->(value:, internal:) { value.all? { |id| id.size == 6 } }
}
}
# ...
endclass EventsService::Send < ApplicationService::Base
# ...
output :invoice_numbers,
type: Array,
consists_of: String,
must: {
be_6_characters: {
is: ->(value:, output:) { value.all? { |id| id.size == 6 } }
}
}
# ...
endОпция format input (^2.4.0) internal (^2.4.0) output (^2.4.0)
Эта опция является валидацией. Эта опция является динамической и не входит в набор основных опций.
Опция max input (^2.4.0) internal (^2.4.0) output (^2.4.0)
Эта опция является валидацией. Эта опция является динамической и не входит в набор основных опций.
Опция min input (^2.4.0) internal (^2.4.0) output (^2.4.0)
Эта опция является валидацией. Эта опция является динамической и не входит в набор основных опций.
Опция prepare input
Эта опция не является валидацией. Она используется для подготовки переданного значения.
WARNING
Используйте опцию prepare осторожно и только для простых подготовительных действий. Например, как показано ниже. Любую логику, которая сложнее той что в примере ниже, лучше применять через действие make.
class PaymentsService::Create < ApplicationService::Base
input :amount_cents,
as: :amount,
type: Integer,
prepare: ->(value:) { Money.from_cents(value, :USD) }
# ...
def create!
outputs.payment = Payment.create!(amount: inputs.amount)
end
end