代码之家  ›  专栏  ›  技术社区  ›  ProGM meca soft

在控制器之间共享一些before_filters

  •  3
  • ProGM meca soft  · 技术社区  · 10 年前

    我有两个父控制器,一个用于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
    

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

    1 回复  |  直到 10 年前
        1
  •  6
  •   janfoeh    10 年前

    你可以使用 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