在控制器之间共享一些before_filters

Pro*_*oGM 3 ruby ruby-on-rails multiple-inheritance ruby-on-rails-3

我有两个父控制器,一个用于API,一个用于普通的html页面.

class ApplicationController < ActionController::Base
    ...
end

class ApiController < ActionController::Metal
    include AbstractController::Callbacks
    ...
end
Run Code Online (Sandbox Code Playgroud)

我想before_filter在两个控制器上分享一些.我试过这样的事情:

class ApplicationController < ActionController::Base
    include MyFilters
end

class ApiController < ActionController::Metal
    include MyFilters
end

module MyFilters
    before_filter :filter1
    before_filter :filter2

    def filter1
    end

    def filter2
    end
    ...
end
Run Code Online (Sandbox Code Playgroud)

而且这个:

module MyFilters
    def self.included(klass)
        klass.before_filter :filter1
        klass.before_filter :filter2
    end

    def filter1
    end

    def filter2
    end
    ...
end
Run Code Online (Sandbox Code Playgroud)

但在这两种情况下我收到:

undefined method `before_filter' for MyFilters:Module
Run Code Online (Sandbox Code Playgroud)

实现这个的正确方法是什么?

jan*_*oeh 6

你可以使用一个问题:

# app/controllers/concerns/my_filters.rb
module MyFilters
  extend ActiveSupport::Concern

  included do
    before_filter :filter1
    before_filter :filter2
  end

  def filter1
  end

  def filter1
  end
end
Run Code Online (Sandbox Code Playgroud)

通过include控制器中的标准使用它们:

class ApplicationController < ActionController::Base
  include MyFilters
end

class ApiController < ActionController::Metal
  include MyFilters
end
Run Code Online (Sandbox Code Playgroud)