Class: ActionDispatch::Journey::Router

Inherits:
Object
  • Object
show all
Defined in:
lib/action_dispatch/journey/router.rb,
lib/action_dispatch/journey/router/utils.rb
more...

Overview

:nodoc:

Defined Under Namespace

Classes: Utils

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(routes) ⇒ Router

Returns a new instance of Router.

[View source]

20
21
22
# File 'lib/action_dispatch/journey/router.rb', line 20

def initialize(routes)
  @routes = routes
end

Instance Attribute Details

#routesObject

Returns the value of attribute routes.


18
19
20
# File 'lib/action_dispatch/journey/router.rb', line 18

def routes
  @routes
end

Instance Method Details

#eager_load!Object

[View source]

24
25
26
27
28
29
# File 'lib/action_dispatch/journey/router.rb', line 24

def eager_load!
  # Eagerly trigger the simulator's initialization so
  # it doesn't happen during a request cycle.
  simulator
  nil
end

#recognize(rails_req) ⇒ Object

[View source]

64
65
66
67
68
69
70
71
72
73
74
# File 'lib/action_dispatch/journey/router.rb', line 64

def recognize(rails_req)
  find_routes(rails_req).each do |match, parameters, route|
    unless route.path.anchored
      rails_req.script_name = match.to_s
      rails_req.path_info   = match.post_match.sub(/^([^\/])/, '/\1')
    end

    parameters = route.defaults.merge parameters
    yield(route, parameters)
  end
end

#serve(req) ⇒ Object

[View source]

31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
# File 'lib/action_dispatch/journey/router.rb', line 31

def serve(req)
  find_routes(req).each do |match, parameters, route|
    set_params  = req.path_parameters
    path_info   = req.path_info
    script_name = req.script_name

    unless route.path.anchored
      req.script_name = (script_name.to_s + match.to_s).chomp("/")
      req.path_info = match.post_match
      req.path_info = "/" + req.path_info unless req.path_info.start_with? "/"
    end

    parameters = route.defaults.merge parameters.transform_values { |val|
      val.dup.force_encoding(::Encoding::UTF_8)
    }

    req.path_parameters = set_params.merge parameters

    status, headers, body = route.app.serve(req)

    if "pass" == headers["X-Cascade"]
      req.script_name     = script_name
      req.path_info       = path_info
      req.path_parameters = set_params
      next
    end

    return [status, headers, body]
  end

  [404, { "X-Cascade" => "pass" }, ["Not Found"]]
end

#visualizerObject

[View source]

76
77
78
79
80
81
# File 'lib/action_dispatch/journey/router.rb', line 76

def visualizer
  tt     = GTG::Builder.new(ast).transition_table
  groups = partitioned_routes.first.map(&:ast).group_by(&:to_s)
  asts   = groups.values.map(&:first)
  tt.visualizer(asts)
end