class RouteSet

Ruby on Rails 2.2.3

Since v2.2.3 Last seen in v2.3.18

Available in: v2.2.3 v2.3.18

BEFORE: 0.191446860631307 ms/url AFTER: 0.029847304022858 ms/url Speed up: 6.4 times

Route recognition is slow due to one-by-one iterating over a whole routeset (each map.resources generates at least 14 routes) and matching weird regexps on each step.

We optimize this by skipping all URI segments that 100% sure can’t be matched, moving deeper in a tree of routes (where node == segment) until first possible match is accured. In such case, we start walking a flat list of routes, matching them with accurate matcher. So, first step: search a segment tree for the first relevant index. Second step: iterate routes starting with that index.

How tree is walked? We can do a recursive tests, but it’s smarter: We just create a tree of if-s and elsif-s matching segments.

We have segments of 3 flavors: 1) nil (no segment, route finished) 2) const-dot-dynamic (like “/posts.:xml”, “/preview.:size.jpg”) 3) const (like “/posts”, “/comments”) 4) dynamic (“/:id”, “file.:size.:extension”)

We split incoming string into segments and iterate over them. When segment is nil, we drop immediately, on a current node index. When segment is equal to some const, we step into branch. If none constants matched, we step into ‘dynamic’ branch (it’s a last). If we can’t match anything, we drop to last index on a level.

Note: we maintain the original routes order, so we finish building

steps on a first dynamic segment.

Example. Given the routes:

0 /posts/
1 /posts/:id
2 /posts/:id/comments
3 /posts/blah
4 /users/
5 /users/:id
6 /users/:id/profile

request_uri = /users/123

There will be only 4 iterations:

1) segm test for /posts prefix, skip all /posts/* routes
2) segm test for /users/
3) segm test for /users/:id
   (jump to list index = 5)
4) full test for /users/:id => here we are!

Inherits from

Object

Namespace

Classes

Methods (defined here)

Private methods

(3) Implementation detail — not part of the public API.

Methods (inherited)

From Object (32)
From ActionController::Caching (3)
From ActionController::Cookies (2)
From ActionController::Flash (1)
From ActionController::HttpAuthentication::Basic::ControllerMethods (3)
From ActionController::RecordIdentifier (5)
From ActionController::RequestForgeryProtection (8)
From ActionController::Rescue (7)
From ActionController::Streaming (2)
From ActionController::Translation (4)
From ActiveRecord::Callbacks (14)
From ActiveRecord::Dirty (4)
From ActiveRecord::Locking::Pessimistic (1)
From ActiveRecord::NamedScope (1)
From ActiveRecord::Serialization (5)
From ActiveRecord::Transactions (4)
From ActiveRecord::Validations (7)
From Benchmark (1)
From ActionController::Components::InstanceMethods (2)
From ActiveRecord::Locking::Optimistic::ClassMethods (7)
From ActiveRecord::NamedScope::ClassMethods (2)
From ActiveRecord::Serialization::ClassMethods (1)
From ActiveRecord::Validations::ClassMethods (13)
From ActiveSupport::Memoizable (1)

Type at least 2 characters to search.

↑↓ navigate · open · esc close