【问题标题】:Share some before_filters between controllers在控制器之间共享一些 before_filters
【发布时间】:2015-02-19 13:12:00
【问题描述】:

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

class ApplicationController < ActionController::Base
    ...
end

class ApiController < ActionController::Metal
    include AbstractController::Callbacks
    ...
end

我想在两个控制器上分享一些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

还有这个:

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

    def filter1
    end

    def filter2
    end
    ...
end

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

undefined method `before_filter' for MyFilters:Module

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

【问题讨论】:

    标签: ruby-on-rails ruby ruby-on-rails-3 multiple-inheritance


    【解决方案1】:

    您可以为此使用concern

    # 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
    

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

    class ApplicationController < ActionController::Base
      include MyFilters
    end
    
    class ApiController < ActionController::Metal
      include MyFilters
    end
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-12-15
      • 2014-03-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-09
      • 2013-05-28
      相关资源
      最近更新 更多