Похоже, что в действительности реализована проблема "макроса":
require 'active_support/concern'
class Module
# A low-cruft shortcut to define a concern.
#
# concern :EventTracking do
# ...
# end
#
# is equivalent to
#
# module EventTracking
# extend ActiveSupport::Concern
#
# ...
# end
def concern(topic, &module_definition)
const_set topic, Module.new {
extend ::ActiveSupport::Concern
module_eval(&module_definition)
}
end
end
include Concerning
end
В этом коде передается объект ruby Module для предоставления метода concern
.
Ключ здесь module_eval(&module_definition)
, который неправильно оценивает блок в контексте определяемого нового модуля.
Что на самом деле происходит при запуске:
concern :Orderable do
COMPLETE = "Complete"
end
::COMPLETE
# => "Complete"
Это то, что вы объявляете постоянную COMPLETE
в главном объекте. По электронной почте Ой!
Для правильной работы он должен выглядеть следующим образом:
def concern(topic, &module_definition)
const_set topic, Module.new do |m|
extend ::ActiveSupport::Concern
m.module_eval(&module_definition)
end
end
Я бы не использовал синтаксис "low-cruft", пока это не исправлено.