Concern
可以方便快捷的扩展某个类或模块,并且处理了潜在的依赖问题。
作用有二:
1) 更简洁、明了的语法。 2) 更好的处理模块之间的依赖关系,规避潜在的模块之间的循环依赖。
约定:ClassMethods 和 class_methods 自动继承、实例方法自动包含、自动使用 class_eval.
原来你需要手动写 included 或 extended 里面的代码,有实例方法、类方法的话,也要手动包含或继承;现在按照约定来即可。
以前:
module M
def self.included(base)
base.extend ClassMethods
base.class_eval do
# 执行某些方法
scope :disabled, -> { where(disabled: true) }
# 执行某些方法
include InstanceMethods
end
end
# 定义类方法
module ClassMethods
# ...
end
# 定义实例方法
def a_instance_method
# ...
end
# 如果实例方法比较多,可以单独成 module,对应上面的 include InstanceMethods
module InstanceMethods
# ...
end
end
现在:
require 'active_support/concern'
module M
extend ActiveSupport::Concern
included do
# 执行某些方法
scope :disabled, -> { where(disabled: true) }
# 执行某些方法
include InstanceMethods
end
# 定义类方法
module ClassMethods
# ...
end
# 定义实例方法
def a_instance_method
# ...
end
# 如果实例方法比较多,可以单独成 module,对应上面的 include InstanceMethods
module InstanceMethods
# ...
end
end
本模块源代码、及示例已经经过多次更改,多学语法,适应改变适应其变化。
最后更新于
这有帮助吗?