Class: Jets::Router

Inherits:
Object
  • Object
show all
Defined in:
lib/jets/router.rb

Constant Summary collapse

@@drawn_router =
nil

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initializeRouter

Returns a new instance of Router.



6
7
8
# File 'lib/jets/router.rb', line 6

def initialize
  @routes = []
end

Instance Attribute Details

#routesObject (readonly)

Returns the value of attribute routes.



5
6
7
# File 'lib/jets/router.rb', line 5

def routes
  @routes
end

Class Method Details

.all_pathsObject

Returns all paths including subpaths. Example: Input: [“posts/:id/edit”] Output: [“posts”, “posts/:id”, “posts/:id/edit”]



116
117
118
# File 'lib/jets/router.rb', line 116

def self.all_paths
  drawn_router.all_paths
end

.all_routes_validObject



131
132
133
# File 'lib/jets/router.rb', line 131

def self.all_routes_valid
  invalid_routes.empty?
end

.drawObject

Class methods



96
97
98
# File 'lib/jets/router.rb', line 96

def self.draw
  drawn_router
end

.drawn_routerObject



101
102
103
104
105
106
# File 'lib/jets/router.rb', line 101

def self.drawn_router
  return @@drawn_router if @@drawn_router

  router = Jets.application.routes
  @@drawn_router = router
end

.has_controller?(name) ⇒ Boolean

Returns:

  • (Boolean)


91
92
93
# File 'lib/jets/router.rb', line 91

def self.has_controller?(name)
  routes.detect { |r| r.controller_name == name }
end

.invalid_routesObject



135
136
137
# File 'lib/jets/router.rb', line 135

def self.invalid_routes
  routes.select { |r| !r.valid? }
end

.routesObject



108
109
110
# File 'lib/jets/router.rb', line 108

def self.routes
  drawn_router.routes
end

.routes_helpObject



120
121
122
123
124
125
126
127
128
129
# File 'lib/jets/router.rb', line 120

def self.routes_help
  return "Your routes table is empty." if routes.empty?

  table = Text::Table.new
  table.head = %w[Verb Path Controller#action]
  routes.each do |route|
    table.rows << [route.method, route.path, route.to]
  end
  table
end

Instance Method Details

#all_pathsObject

Useful for creating API Gateway Resources



58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
# File 'lib/jets/router.rb', line 58

def all_paths
  results = []
  paths = routes.map(&:path)
  paths.each do |p|
    sub_paths = []
    parts = p.split('/')
    until parts.empty?
      parts.pop
      sub_path = parts.join('/')
      sub_paths << sub_path unless sub_path == ''
    end
    results += sub_paths
  end
  @all_paths = (results + paths).sort.uniq
end

#api_mode?Boolean

Returns:

  • (Boolean)


34
35
36
37
38
39
40
41
42
43
44
45
46
# File 'lib/jets/router.rb', line 34

def api_mode?
  if Jets.config.key?(:api_mode) || Jets.config.key?(:api_generator)
    puts <<~EOL.colorize(:yellow)
      DEPRECATED: Jets.config.api_generator
      Instead, please update your config/application.rb to use:
        Jets.config.mode = 'api'
      You can also run:
        jets upgrade:v1
    EOL
  end
  api_mode = Jets.config.mode == 'api' || Jets.config.api_mode || Jets.config.api_generator
  api_mode
end

#create_route(options) ⇒ Object



48
49
50
# File 'lib/jets/router.rb', line 48

def create_route(options)
  @routes << Route.new(options)
end

#draw(&block) ⇒ Object



10
11
12
# File 'lib/jets/router.rb', line 10

def draw(&block)
  instance_eval(&block)
end

#ordered_routesObject

Useful for RouterMatcher

Precedence:

  1. Routes with no captures get highest precedence: posts/new

  2. Then consider the routes with captures: post/:id

  3. Last consider the routes with wildcards: *catchall

Within these 2 groups we consider the routes with the longest path first since posts/:id and posts/:id/edit can both match.



83
84
85
86
87
88
89
# File 'lib/jets/router.rb', line 83

def ordered_routes
  length = Proc.new { |r| r.path.length * -1 }
  capture_routes = routes.select { |r| r.path.include?(':') }.sort_by(&length)
  wildcard_routes = routes.select { |r| r.path.include?('*') }.sort_by(&length)
  simple_routes = (routes - capture_routes - wildcard_routes).sort_by(&length)
  simple_routes + capture_routes + wildcard_routes
end

#resources(name) ⇒ Object

resources macro expands to all the routes



22
23
24
25
26
27
28
29
30
31
32
# File 'lib/jets/router.rb', line 22

def resources(name)
  get "#{name}", to: "#{name}#index"
  get "#{name}/new", to: "#{name}#new" unless api_mode?
  get "#{name}/:id", to: "#{name}#show"
  post "#{name}", to: "#{name}#create"
  get "#{name}/:id/edit", to: "#{name}#edit" unless api_mode?
  put "#{name}/:id", to: "#{name}#update"
  post "#{name}/:id", to: "#{name}#update" # for binary uploads
  patch "#{name}/:id", to: "#{name}#update"
  delete "#{name}/:id", to: "#{name}#delete"
end

#root(to) ⇒ Object

root “posts#index”



53
54
55
# File 'lib/jets/router.rb', line 53

def root(to)
  @routes << Route.new(path: '', to: to, method: :get, root: true)
end