Ruby on rails 围绕回调堆栈中的\u操作进行Rails

Ruby on rails 围绕回调堆栈中的\u操作进行Rails,ruby-on-rails,Ruby On Rails,我刚刚发现了一些行动回调。我真的不明白这些回调如何与其他回调一起工作,尤其是与在动作之前使用(append)或回调之前使用prepend\u相比,调用堆栈看起来如何。around操作回调是否适合这样的访问控制: ApplicationController < ... around_action :access_control private def access_control if @authorized yield else # Show er

我刚刚发现了一些行动回调。我真的不明白这些回调如何与其他回调一起工作,尤其是与在动作之前使用
(append)或
回调之前使用
prepend\u相比,调用堆栈看起来如何。around操作回调是否适合这样的访问控制:

ApplicationController < ...

  around_action :access_control

  private

  def access_control
  if @authorized
    yield
  else
    # Show error page
  end
end

class AdminController < ApplicationController

  before_action :authorize_admins

  private

  def authorize_admins
    if current_user.admin?
      @authorizez = true
    end
  end
ApplicationController<。。。
环绕行动:访问控制
私有的
def访问控制
如果@authorized
产量
其他的
#显示错误页
结束
结束
类AdminController<应用程序控制器
在\u操作之前:授权\u管理员
私有的
def授权\u管理员
如果是当前的_user.admin?
@Z=true
结束
结束
环绕动作的行为是否类似于动作前追加动作
+
动作后追加动作
或动作前追加动作
+
动作后追加动作


或者其他一些不同的东西?

围绕动作
更像是在动作之前追加动作
+
在动作之后追加动作

在内部,可以把它想象成rails有两个数组,
@before\u actions
@after\u actions
。因此,当您在动作前后声明
时,它会将其推送到动作前的
@结尾处,并将其取消移动到动作后的
@结尾处

通过以下快速测试:

class SomeController < ApplicationController
  before_action :before_action
  after_action :after_action
  around_filter :around_action

  def before_action
    $stderr.puts "From before_action"
  end

  def after_action
    $stderr.puts "From after_action"
  end

  def around_action
    begin
      $stderr.puts "From around_action before yielding"
      yield
      $stderr.puts "From around_action after yielding"
    end
  end

  def index
  end
end

append
prepend
有点不同。我不会从这个角度来看待这个问题。事实上,你的问题没有意义。环绕动作的行为与放置在同一位置的动作前+动作后相同。(
before(after)\u filter
与Rails 4中的
before(after)\u action
相同)@chumakoff我知道
append\u before\u action
before\u action
的别名,after\u action的别名相同?我正在使用
操作
回调
重写所有内容,以获得更清晰的信息。您的意思是,如果控制器将具有以下过滤器:
在动作之后:操作1
<代码>围绕动作:动作2
然后
action2
将在
action1
之前完成?是的,请在更新中查看示例代码和输出。你的权利,伙计!它就像ActhEngRoD中的<代码> AdOrth.< /Cord>回调。然后考虑它的答案。
Started GET "/" for 127.0.0.1 at 2016-03-21 17:11:01 -0700
Processing by SomeController#index as HTML
From before_action
From around_action before yielding
  Rendered some/index.html.slim within layouts/index (1.5ms)
From around_action after yielding
From after_action