Как работает обратный вызов 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 для размещения действия в середине.