Перейти к основному содержимому
Версия: 1.9

Internal

Внутренние приватные атрибуты можно определять через метод internal.

Использование

Назначение и использование внутренних аргументов сервиса осуществляется через методы internals=/internals или их алиасы int=/int.

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

# ...

def something
internals.full_name = [inputs.first_name, inputs.middle_name, inputs.last_name].compact.join(" ")
# или
# int.full_name = [inp.first_name, inp.middle_name, inp.last_name].compact.join(" ")
end
end

Опции

Опция type

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

class NotificationService::Create < ApplicationService::Base
input :user, type: User

internal :inviter, type: User

output :notification, type: Notification

make :assign_inviter
make :create_notification!

private

def assign_inviter
internals.inviter = inputs.user.inviter
end

def create_notification!
outputs.notification = Notification.create!(user: inputs.user, inviter: internals.inviter)
end
end

Методы предикаты

У любого internal'а есть метод с вопросительным знаком. С логикой обработки данных можно ознакомиться здесь.

# ...

internal :full_name, type: String

# ...

def something
return unless internals.full_name? # вместо `internals.full_name.present?`

# ...
end