Группирование действий
Собрать в одну группу выполнение несколько методов можно при помощи метода stage
.
INFO
Использование опции position
для make
будет сортировать только внутри stage
.
ruby
stage do
make :create_user!
make :create_blog_for_user!
make :create_post_for_user_blog!
end
Опция only_if
Перед вызовом методов внутри stage
будет проверено условие, описанное в only_if
.
ruby
stage do
only_if ->(context:) { Settings.features.preview.enabled }
make :create_user!
make :create_blog_for_user!
make :create_post_for_user_blog!
end
Опция only_unless
Противоположность опции only_if
.
ruby
stage do
only_unless ->(context:) { Settings.features.preview.disabled }
make :create_user!
make :create_blog_for_user!
make :create_post_for_user_blog!
end
Опция wrap_in
Группу методов, находящийся в stage
можно обернуть во что-то. Например, это может быть ActiveRecord::Base.transaction
от Rails.
ruby
stage do
wrap_in ->(methods:, context:) { ActiveRecord::Base.transaction { methods.call } }
make :create_user!
make :create_blog_for_user!
make :create_post_for_user_blog!
end
Опция rollback
Если в одном из методов в группе или в wrap_in
возникло исключение, то это можно обработать при помощи метода rollback
.
ruby
stage do
wrap_in ->(methods:, context:) { ActiveRecord::Base.transaction { methods.call } }
rollback :clear_data_and_fail!
make :create_user!
make :create_blog_for_user!
make :create_post_for_user_blog!
end
# ...
def clear_data_and_fail!(e)
# ...
fail!(message: "Failed to create data: #{e.message}")
end