Remove method definitions from included block when using Concern
Hi fellow Rubyists,
I saw methods defined directly in included block when using Concern several times.
module AModule extend ActiveSupport::Concern included do # this is BAD def a_method end end end
It is a bad practice and it breaks things, all instance methods should go to the AModule, and all class methods to a ClassMethods module.
- It dynamically creates methods in each class, they are not shared through module, it is slow.
- It cannot be accessed for extension, there is no module to include to.
- it breaks `super` calls.
We should avoid using this and go for:
module AModule extend ActiveSupport::Concern included do # e.g. has_one :user end module ClassMethods def a_method end end end
I'll create issue to remove these bad definitions.
Fixes #5713: Removes instance method declarations from included block of concerns.