In the Rails project some of the most commonly used methods are extracted and generally placed in the corresponding concerns directory. generally different concern files are stored in these directories. a file is a module for example:
module UserPlan
extend ActiveSupport::Concern
included do
belongs_to :plan
end
class_method do
def cached_all_plan
#bala bala
end
end
end
Note that the module extend ActiveSupport::Concern is used in this module. we will explore its benefits and why this module exists.
Let's start with the following example:
module Foo
def self.included(base)
base.class_eval do
def self.method1
...
end
end
end
end
module Bar
def self.included(base)
base.method1
end
end
class Host
include Foo # The Foo module was introduced because the Bar module depends on it
include Bar # Bar reference is to call its method1 method
end
If you want to use the method1 method in the Host class, you must refer to the Bar module but the Bar module depends on the Foo module.
Did you find any problems? the Host class does not care about the Foo module but in order to call the method1 method when the Bar is included. you have to Introduce the Foo module.
There is an improved code along the above logic:
module Bar
include Foo
def self.included(base)
base.method1
end
end
class Host
include Bar
end
The Host only cares about the reference of Bar so the Foo module is put in the Bar. It seems that there is no problem but when you implement the running code, you will find that the code cannot run.
In the included hook method of the Bar module the base object points to the Host and the include Foo in Bar will put method1 on the instance object of Bar. when the instance object of the Host calls method1, it will throw a method not found exception
How to do it?
require 'active_support/concern'
module Foo
extend ActiveSupport::Concern
included do
def self.method1
...
end
end
end
module Bar
extend ActiveSupport::Concern
include Foo
included do
self.method1
end
end
class Host
include Bar
end
By referring to ActiveSupport::Concern to solve the problem of interdependence between modules and modules.
The comparison found that the code is much simpler and the call is also very convenient. the readability of the code has also become very good and very clear. now ActiveSupport::Concern is quite widely used and many good gems will be used. after all It was put in the ActiveSupport Gem.
Hope it can help you :)

Top comments (0)