4

我有一些模块要包含在我的控制器类中。这些模块定义before_filter

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
  1. BasicFeatures模块包含在AdvancedFeatures模块中时,其中没有before_filter方法。
  2. AdvancedController没有before_filter接到电话。

我需要我的两个控制器来获得before_filter没有任何代码重复的。我不知道我是否使用了最好的方法,所以我愿意接受任何建议。

4

2 回答 2

5

这就是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'

你也可以嵌套它们——也就是说,创建包含关注点的关注点——一切都会按预期工作。这是文档

于 2013-07-29T14:05:33.847 回答
0

你可以试试这个。除了在 AdvancedFeatures 中包含模块,您可以在包含 AdvancedFeatures 的类中包含 BasicFeatures 模块

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
于 2013-07-29T14:08:15.883 回答