Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ssis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 在Ruby中调用具有多级模块结构的类方法_Ruby On Rails_Ruby - Fatal编程技术网

Ruby on rails 在Ruby中调用具有多级模块结构的类方法

Ruby on rails 在Ruby中调用具有多级模块结构的类方法,ruby-on-rails,ruby,Ruby On Rails,Ruby,我的控制器类中包含了一些模块。这些模块在过滤器之前定义: module BasicFeatures def filter_method ... end def self.included(base) base.before_filter(:filter_method) ... end end module AdvancedFeatures include BasicFeatures ... end 课程包括: class BasicContro

我的控制器类中包含了一些模块。这些模块在过滤器之前定义

module BasicFeatures
  def filter_method
    ...
  end
  def self.included(base)
    base.before_filter(:filter_method)
    ...
  end
end

module AdvancedFeatures
  include BasicFeatures
  ...
end
课程包括:

class BasicController < ApplicationController
    include BasicFeatures
end

class AdvancedController < ApplicationController
    include AdvancedFeatures
end
class BasicController
  • AdvancedFeatures
    模块中包含
    BasicFeatures
    模块时,其中没有
    before\u filter
    方法
  • AdvancedController
    没有在\u filter
  • 调用之前获取
    
    
    我需要我的两个控制器在没有任何代码重复的情况下在过滤器之前获取
    。我不知道我是否使用了最好的方法,所以我愿意接受任何建议。

    这就是创建
    ActiveSupport::Concern
    的原因

    module BasicFeatures
      extend ActiveSupport::Concern
    
      included do
        before_filter :require_user
      end
    
      def this_is_an_instance_method
        'foo'
      end
    
      module ClassMethods
        def this_is_a_class_method
          'bar'
        end
      end
    end
    
    class SomeClass
      include BasicFeatures
    end
    
    SomeClass.new.this_is_an_instance_method #=> 'foo'
    

    您还可以嵌套它们——也就是说,创建包含关注点的关注点——并且一切都将按预期工作。还有。

    你可以试试这个。您可以在包含AdvancedFeatures的类中包含BasicFeatures模块,而不是将模块包含在AdvancedFeatures中

    module BasicFeatures
        def filter_method
          #code....
        end
    
        #some others basic methods...
    
        def self.included(base)
          base.before_filter(:filter_method)
          #some other class method calls
        end
    end
    
    module AdvancedFeatures
      def self.included klass
        klass.class_eval do
          include BasicFeatures
        end
      end
    
      #some advanced methods
    end
    

    非常好@coreyward。我不知道,
    AS::Concern
    处理了nesting.omg@coreyward,它就像一个符咒!Rails总是让我惊讶!