Rails控制器和关注点中的before_filters的顺序

时间:2016-01-05 10:19:25

标签: ruby-on-rails ruby-on-rails-4 actioncontroller before-filter activesupport-concern

我对Rails的关注定义如下:

module MyConcern
  extend ActiveSupport::Concern

  included do
    before_filter :filter_inside_concern
  end

  def filter_inside_concern
    # ...
  end
end

我在控制器层也有一个before_filter

class MyController < ApplicationController
  before_filter :filter_inside_controller
end

如果我在MyConcern中包含MyController,那么调用before过滤器的顺序是否取决于代码的排列方式?例如,如果我们有

class MyController < ApplicationController
  include MyConcern

  before_filter :filter_inside_controller
end

filter_inside_concern之前调用filter_inside_controller(反之亦然)?

谢谢!

2 个答案:

答案 0 :(得分:2)

我重新创建了你的情况,并找出执行顺序取决于你编写两个过滤器的顺序。

如果你写

  include MyConcern
  before_filter :filter_inside_controller

关注过滤器将首先执行

或者如果按此顺序编写过滤器

  before_filter :filter_inside_controller
  include MyConcern

控制器过滤器将首先执行

答案 1 :(得分:1)

如果您使用:

class MyController < ApplicationController
  include MyConcern

  before_filter :filter_inside_controller
end

filter_inside_concern将在filter_inside_controller

之前被调用

如果您想在filter_inside_controller之前调出filter_inside_concern,则需要使用prepend_before_filter代替:

class MyController < ApplicationController
  include MyConcern

  prepend_before_filter :filter_inside_controller
end

作为旁注,我们将弃用before_filterprepend_before_filter。您应该使用before_actionprepend_before_action代替。