Использование действий
Действия в сервисе — это поочередный вызов методов. Вызов методов сервиса происходит при помощи метода 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]
end
class 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 # суффикс имени метода
}
}
)
end
class 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