Использование действий
Действия в сервисе — это поочередный вызов методов. Вызов методов сервиса происходит при помощи метода make.
Примеры
Минимальный
В минимальном виде вызов методов через make необязателен. Вместо него можно использовать метод call.
class PostsService::Create < ApplicationService::Base
def call
# something
end
endНесколько методов
class PostsService::Create < ApplicationService::Base
# ...
make :assign_api_model
make :perform_api_request
make :process_result
def assign_api_model
internals.api_model = APIModel.new(...)
end
def perform_api_request
internals.response = APIClient.resource.create(internals.api_model)
end
def process_result
ARModel.create!(internals.response)
end
endОпции
Подробнее про опции вы можете узнать в разделе опций.
Группа из нескольких действий
Подробнее про группу из нескольких действий (методов) вы можете узнать в разделе группирования.
Алиасы для make
Через конфигурацию action_aliases можно добавить альтернативные варианты для метода make.
configuration do
action_aliases %i[execute]
end
execute :something
def something
# ...
endКастомизация для make
Через конфигурацию action_shortcuts можно добавить часто используемые слова, которые используются в виде префиксов в именах методов. Имена самих методов короче не станут, но это позволит сократить строки с применением метода make и улучшить читаемость кода сервиса, сделав его выразительнее.
Простой режим
В простом режиме значения передаются в виде массива символов.
configuration do
action_shortcuts %i[assign perform]
endclass CMSService::API::Posts::Create < CMSService::API::Base
# ...
assign :model
perform :request
private
def assign_model
# Build model for API request
end
def perform_request
# Perform API request
end
# ...
endРасширенный режим Начиная с 2.14.0
В расширенном режиме значения передаются в виде хеша.
configuration do
action_shortcuts(
%i[assign],
{
restrict: { # замена для make
prefix: :create, # префикс имени метода
suffix: :restriction # суффикс имени метода
}
}
)
endclass PaymentsService::Restrictions::Create < ApplicationService::Base
input :payment, type: Payment
# Восклицательный знак будет перемещен в конец имени метода
restrict :payment!
private
def create_payment_restriction!
inputs.payment.restrictions.create!(
reason: "Suspicion of fraud"
)
end
end