Контекст: Я решаю проблему, когда мне нужна программа внешнего аудита, чтобы понимать и «применять» маршруты Rails.Один из вариантов написания этой внешней программы мог бы заключаться в разборе выходных данных rake routes
, но это привело бы к ненужному дублированию кода, который анализирует эти маршруты и преобразует их в хорошо структурированные Journey::Route
объекты.
Поэтому я планирую вывести Rails.application.routes
в общий формат (YAML или JSON), который может понять внешняя программа, и может построить маршрутизатор на основе этих данных.
Вопрос: Учитывая этот контекст, я пытаюсь понять структуру атрибута Journey::Path::Paternet#spec
, который находится внутри объекта Journey::Route
и оказывается центром всех действий.
Например,следующий маршрут - /posts/:id
- преобразуется в следующую "спецификацию" -
#<Journey::Nodes::Cat:0x00007ff193327ee0
@left=
#<Journey::Nodes::Cat:0x00007ff193308630
@left=
#<Journey::Nodes::Cat:0x00007ff1933087e8
@left=
#<Journey::Nodes::Cat:0x00007ff193308bf8
@left=#<Journey::Nodes::Slash:0x00007ff193308d38 @left="/", @memo=nil>,
@memo=nil,
@right=#<Journey::Nodes::Literal:0x00007ff193308c48 @left="posts", @memo=nil>>,
@memo=nil,
@right=#<Journey::Nodes::Slash:0x00007ff193308a40 @left="/", @memo=nil>>,
@memo=nil,
@right=#<Journey::Nodes::Symbol:0x00007ff1933086d0 @left=":id", @memo=nil, @regexp=/[^\.\/\?]+/>>,
@memo=nil,
@right=
#<Journey::Nodes::Group:0x00007ff193309c10
@left=
#<Journey::Nodes::Cat:0x00007ff193308220
@left=#<Journey::Nodes::Dot:0x00007ff1933084f0 @left=".", @memo=nil>,
@memo=nil,
@right=#<Journey::Nodes::Symbol:0x00007ff193308338 @left=":format", @memo=nil, @regexp=/[^\.\/\?]+/>>,
@memo=nil>>
- Какие атрибуты влево / вправо в
Journey::Nodes::Cat
объекте?Что решает, какой токен будет «левым», а какой - «правым» - Это подозрительно похоже на двоичное дерево, но почему самый первый токен (то есть первый
/
), «самый внутренний»"(или листовой узел)?Разве это не должен быть «самый внешний» (или корневой узел)? - Какой эффективный способ пройти по этой структуре данных при выполнении сопоставления маршрутов?