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总是让我惊讶!