我对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方法失败导致整个回调失败?这是展示动作的渲染吗?我不明白。请帮助。
答案 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
将动作放在中间。