У меня есть модуль с некоторыми методами "class" или "DSL", который на данный момент выглядит следующим образом:
module Things
module ClassMethods
def thing id, title, **options
# ... create and register a thing ...
end
# ... more DSL methods ...
end
extend ClassMethods
# define project things
thing :ruby, "Ruby programming language"
thing :rails, "Ruby on Rails web framework"
thing :active_support, "ActiveSupport library"
end
Поэтому я определяю методы DSL в ClassMethods
, расширяю Things
с помощью ClassMethods
затем используйте DSL в теле модуля.Я выбрал имя ClassMethods
в соответствии с соглашением, которое я вижу, несмотря на то, что модуль не является активной записью Концерна.
Теперь я хотел бы отделить определение DSL от его использования, поэтому я разделил код на
lib/things/class_methods.rb
:
module Things
module ClassMethods
def thing id, title, **options
# ... create and register a thing ...
end
# ... more DSL methods ...
end
end
и lib/things.rb
:
require_relative "things/class_methods"
module Things
extend ClassMethods
# define project things
thing :ruby, "Ruby programming language"
thing :rails, "Ruby on Rails web framework"
thing :active_support, "ActiveSupport library"
end
Но после этого что-то ломается: код работает в первый раз после перезапуска сервера rails, как и предполагалось, но последующие запросы, использующие этот модуль, вызывают неясные ошибки или жалуются на то, что методы DSL не определены или ведут себя иначекак будто звонки DSL не делали то, что они должны были.Такое ощущение, что строка extend ClassMethods
обнаруживает неправильный модуль ClassMethod
, но тогда я не понимаю, почему я работаю изначально.
Есть идеи, что именно не так с моим подходом и как лучше всего решить проблему?Должен ли я переименовать модуль DSL, чтобы он не конфликтовал с ClassMethods
, определенным в другом месте в структуре?Или я могу еще что-нибудь сделать, чтобы продолжать использовать имя ClassMethods
без конфликта?