around_action回调如何工作?需要解释

时间:2015-01-13 21:58:42

标签: ruby-on-rails callback

我对around_action感到非常困惑。他们是如何工作的?有人可以向我提供他们如何工作的例子/解释吗?

这是我的敏捷Web开发4书中的一句话:

  

围绕回调包裹动作的执行。你可以写一个   两种不同风格的回调。在第一个,回调是   一大块代码。在执行操作之前调用该代码。如果回调代码调用yield,则执行该操作。操作完成后,回调代码将继续执行。因此,yield之前的代码就像before action回调,yield之后的代码就是after action回调。如果回调代码从不调用yield。该操作未运行 - 这与之前的操作回调返回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是否作为&#34;之前的&#34;部分并提升ActiveRecord :: Rollback作为&#34;之后&#34;部分?这种方法屈服于什么?是节目吗?什么会导致yield方法失败导致整个回调失败?这是展示动作的渲染吗?我不明白。请帮助。

2 个答案:

答案 0 :(得分:16)

我的理解如下:

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

答案 1 :(得分:15)

around_callback的关键是yield。对于wrap_in_transaction示例:yield已替换为show操作。当show结束(呈现包含)时,wrap_in_transaction继续并执行回滚。

在导轨guides,您可以找到:

  

例如,在更改具有批准工作流程的网站中,管理员可以轻松地预览它们,只需在事务中应用它们:...请注意,周围的过滤器也会包装呈现。特别是,如果在上面的示例中,视图本身通过作用域或其他内容从数据库中读取,它将在事务中执行此操作,从而将数据呈现为预览。&#34;

这意味着show的用户可以在回滚之前看到信息(在这种情况下,show必须进行需要回滚的排序更新,因为它是一个信息操作)。 / p>

你可以认为around_callback只是一个方法之前的回调和后回调,使用yield将动作放在中间。