Skip to content

Использование опций в атрибутах

Опция type input internal output

Эта опция является валидацией. Будет проверять чтобы переданное значение соответствовало указанному типу (классу). Используется метод is_a?.

Всегда обязательно для указания. Должно содержать один или несколько классов.

ruby
class NotificationsService::Create < ApplicationService::Base
  input :user, type: User
  input :need_to_notify, type: [TrueClass, FalseClass]

  # ...
end
ruby
class NotificationsService::Create < ApplicationService::Base
  # ...

  internal :inviter, type: User

  # ...
end
ruby
class NotificationsService::Create < ApplicationService::Base
  # ...

  output :notification, type: Notification

  # ...
end

Опция required input

Эта опция является валидацией. Будет проверять чтобы переданное значение не было пустым. Используется метод present?.

По умолчанию required имеет значение true.

ruby
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

Эта опция не является валидацией. Будет назначать значение для атрибута, если оно не было передано в сервис.

ruby
class UsersService::Create < ApplicationService::Base
  # ...

  input :middle_name,
        type: String,
        required: false,
        default: "<unknown>"

  # ...
end

Опция as input

Эта опция не является валидацией. Будет указывать новое имя атрибута для работы внутри сервиса. Исходное имя внутри сервиса станет недоступным.

ruby
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?.

ruby
class EventsService::Send < ApplicationService::Base
  input :event_name,
        type: String,
        inclusion: %w[created rejected approved]

  # ...
end
ruby
class EventsService::Send < ApplicationService::Base
  # ...

  internal :event_name,
           type: String,
           inclusion: %w[created rejected approved]

  # ...
end
ruby
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.

ruby
input :ids,
      type: Array,
      consists_of: String
ruby
internal :ids,
         type: Array,
         consists_of: String
ruby
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.

Явное применение опции необязательно. Если значение схемы не указано, то валидация будет пропущена. По умолчанию значение не указано.

ruby
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 }
          }
        }
      }
ruby
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 }
             }
           }
         }
ruby
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 }
           }
         }
       }

Каждый ожидаемый ключ хеша должен быть описан в таком формате:

ruby
{
  request_id: { type: String, required: true }
}

Допускаются следующие опции: type, required и опциональная default.

Если в type указывается значение Hash, то можно описать вложенность в таком же формате.

Опция must input internal (^2.2.0) output (^2.2.0)

Эта опция является валидацией. Позволяет создавать собственные валидации.

ruby
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
ruby
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
ruby
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.

ruby
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