Использование опций в атрибутах
Опция type
input internal output
Эта опция является валидацией. Будет проверять чтобы переданное значение соответствовало указанному типу (классу). Используется метод is_a?
.
Всегда обязательно для указания. Должно содержать один или несколько классов.
class NotificationsService::Create < ApplicationService::Base
input :user, type: User
input :need_to_notify, type: [TrueClass, FalseClass]
# ...
end
class NotificationsService::Create < ApplicationService::Base
# ...
internal :inviter, type: User
# ...
end
class 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)
Эта опция является валидацией. Будет проверять чтобы переданное значение находилось в указанном массиве. Используется метод include?
.
class EventsService::Send < ApplicationService::Base
input :event_name,
type: String,
inclusion: %w[created rejected approved]
# ...
end
class EventsService::Send < ApplicationService::Base
# ...
internal :event_name,
type: String,
inclusion: %w[created rejected approved]
# ...
end
class 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: String
internal :ids,
type: Array,
consists_of: String
output :ids,
type: Array,
consists_of: String
Опция schema
input (^2.0.0) internal (^2.0.0) output (^2.0.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
.
Если в 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 } }
}
}
# ...
end
class 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 } }
}
}
# ...
end
class 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)
Эта опция является валидацией. Эта опция является динамической и не входит в набор основных опций.
Опция min
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)
Эта опция является валидацией. Эта опция является динамической и не входит в набор основных опций.
Опция 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