Как работает обратный вызов around_action? Требуется объяснение
Я ужасно смущен вокруг about_action. Как они работают? Может кто-нибудь, пожалуйста, предоставит мне пример/объяснение того, как они работают?
Это цитата из моей книги Agile Web Development 4:
Вокруг обратных вызовов завершается выполнение действий. Вы можете написать вокруг обратного вызова в двух разных стилях. В первом обратном вызове один кусок кода. Этот код вызывается до того, как действие будет выполнено. Если код обратного вызова вызывает выход, действие выполняется. Когда действие завершается, код обратного вызова продолжает выполняться. Таким образом, код перед выходом выглядит как обратный вызов до действия, а код после выхода - обратный вызов после действия. Если код обратного вызова никогда не вызывает доходность. действие не запускается - это то же самое, что иметь перед обратным вызовом перед возвратом false.
Я как бы понял это, когда прочитал. Вот пример из руководства Rails
class ChangesController < ApplicationController
around_action :wrap_in_transaction, only: :show
private
def wrap_in_transaction
ActiveRecord::Base.transaction do
begin
yield
ensure
raise ActiveRecord::Rollback
end
end
end
end
Итак, что здесь происходит? Действует ли ActiveRecord:: Base.transaction как часть "до" и поднимет ActiveRecord:: Rollback как часть "после"? Что это за метод? Это шоу? Наконец, что может привести к тому, что метод доходности завершится с ошибкой, что приведет к сбою всего обратного вызова? Будет ли это проявление действия шоу? Я не понимаю. Помогите пожалуйста.
Ответы
Ответ 1
Мое понимание таково:
begin
# Do before action...
logger.info 'I am the before action'
# Do the action, which is passed as a block to your "around filter"
# Note that if you were to delete this line, the action will never be called!
yield
# Do after action...
logger.info 'I am the after action'
ensure
raise ActiveRecord::Rollback
end
Ответ 2
Ключом round_callback является yield
. В случае примера wrap_in_transaction
: yield заменяется действием show
. Когда шоу заканчивается (включается рендеринг), wrap_in_transaction продолжается и выполняет откат.
В rails guides вы можете найти:
Например, на веб-сайте, где изменения имеют рабочий процесс утверждения, администратор может легко их просмотреть, просто примените их к транзакции:... Обратите внимание, что вокруг фильтра также выполняется рендеринг. В частности, если в приведенном выше примере само представление читается из базы данных через область видимости или что-то еще, оно будет делать это внутри транзакции и, таким образом, представляет данные для предварительного просмотра ".
Это означает, что пользователь в show
может видеть информацию перед откатом (в этом случае show
должен выполнять сортировку обновления, которая требует откат, потому что это информационное действие).
Вы можете подумать, что round_callback является перед обратным вызовом и после обратного вызова только одним методом, используя yield
для размещения действия в середине.