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

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

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

  # ...
end

Опция consists_of input internal output

Эта опция является валидацией. Будет проверять чтобы каждое значение в коллекции соответствовало указанному типу (классу). Используется метод 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 internal output

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

Работает только с типом 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

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

ruby
class PaymentsService::Create < ApplicationService::Base
  input :invoice_numbers,
        type: Array,
        consists_of: String,
        must: {
          be_6_characters: {
            is: ->(value:) { value.all? { |id| id.size == 6 } }
          }
        }

  # ...
end

Опция prepare input

Эта опция не является валидацией. Она используется для подготовки переданное значения.

WARNING

Используйте опцию prepare осторожно и только для простых подготовительных действий.

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