Class: Volt::Routes

Inherits:
Object show all
Defined in:
lib/volt/router/routes.rb

Overview

The Routes class takes a set of routes and sets up methods to go from a url to params, and params to url. routes do

get "/about", _view: 'about'
get "/blog/{_id}/edit", _view: 'blog/edit', _action: 'edit'
get "/blog/{_id}", _view: 'blog/show', _action: 'show'
get "/blog", _view: 'blog'
get "/blog/new", _view: 'blog/new', _action: 'new'
get "/cool/{_name}", _view: 'cool'

end

Using the routes above, we would generate the following:

}

– nil represents a terminal – * represents any match – a number for a parameter means use the value in that number section

}

}

Match for params ]

Instance Method Summary collapse

Constructor Details

#initializeRoutes

Returns a new instance of Routes.



42
43
44
45
46
47
48
49
50
51
# File 'lib/volt/router/routes.rb', line 42

def initialize
  # Paths where there are no bindings (an optimization)
  @direct_routes   = {}

  # Paths with bindings
  @indirect_routes = {}

  # Matcher for going from params to url
  @param_matches   = []
end

Instance Method Details

#define(&block) ⇒ Object



53
54
55
56
57
# File 'lib/volt/router/routes.rb', line 53

def define(&block)
  instance_eval(&block)

  self
end

#get(path, params = {}) ⇒ Object

Add a route



60
61
62
63
64
65
66
67
68
69
# File 'lib/volt/router/routes.rb', line 60

def get(path, params = {})
  params = params.symbolize_keys
  if has_binding?(path)
    add_indirect_path(path, params)
  else
    @direct_routes[path] = params
  end

  add_param_matcher(path, params)
end

#params_to_url(test_params) ⇒ Object

Takes in params and generates a path and the remaining params that should be shown in the url. The extra “unused” params will be tacked onto the end of the url ?param1=value1, etc…

returns the url and new params, or nil, nil if no match is found.



76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
# File 'lib/volt/router/routes.rb', line 76

def params_to_url(test_params)
  # Add in underscores
  test_params = test_params.each_with_object({}) do |(k, v), obj|
    obj[:"_#{k}"] = v
  end

  @param_matches.each do |param_matcher|
    # TODO: Maybe a deep dup?
    result, new_params = check_params_match(test_params.dup, param_matcher[0])

    if result
      return param_matcher[1].call(new_params)
    end
  end

  [nil, nil]
end

#url_to_params(path) ⇒ Object

Takes in a path and returns the matching params. returns params as a hash



96
97
98
99
100
101
102
103
104
105
# File 'lib/volt/router/routes.rb', line 96

def url_to_params(path)
  # First try a direct match
  result = @direct_routes[path]
  return result if result

  # Next, split the url and walk the sections
  parts = url_parts(path)

  match_path(parts, parts, @indirect_routes)
end