Class: Merb::Router

Inherits:
Object show all
Defined in:
lib/merb-core/dispatch/router.rb,
lib/merb-core/dispatch/router/route.rb,
lib/merb-core/dispatch/router/behavior.rb,
lib/merb-core/dispatch/router/cached_proc.rb

Defined Under Namespace

Classes: Behavior, CachedProc, Route

Constant Summary collapse

SEGMENT_REGEXP =
/(:([a-z_][a-z0-9_]*|:))/
SEGMENT_REGEXP_WITH_BRACKETS =
/(:[a-z_]+)(\[(\d+)\])?/
JUST_BRACKETS =
/\[(\d+)\]/
PARENTHETICAL_SEGMENT_STRING =
"([^\/.,;?]+)".freeze
@@named_routes =
{}
@@routes =
[]

Class Method Summary collapse

Class Method Details

.append(&block) ⇒ Object

Appends the generated routes to the current routes.

Parameters

&block

A block that generates new routes when yielded a new Behavior.



23
24
25
# File 'lib/merb-core/dispatch/router.rb', line 23

def append(&block)
  prepare(@@routes, [], &block)
end

.compileObject

Defines the match function for this class based on the compiled_statement.



66
67
68
69
# File 'lib/merb-core/dispatch/router.rb', line 66

def compile
  puts "compiled route: #{compiled_statement}" if $DEBUG
  eval(compiled_statement, binding, __FILE__, __LINE__)
end

.compiled_statementObject

Returns

String

A routing lambda statement generated from the routes.



54
55
56
57
58
59
60
61
62
# File 'lib/merb-core/dispatch/router.rb', line 54

def compiled_statement
  @@compiled_statement = "def match(request)\n"
  @@compiled_statement << "  params = request.params\n"
  @@compiled_statement << "  cached_path = request.path\n  cached_method = request.method.to_s\n  "
  @@routes.each_with_index { |route, i| @@compiled_statement << route.compile(i == 0) }
  @@compiled_statement << "  else\n    [nil, {}]\n"
  @@compiled_statement << "  end\n"
  @@compiled_statement << "end"
end

.generate(name, params = {}, fallback = {}) ⇒ Object

Generates a URL based on passed options.

Parameters

name<~to_sym, Hash>

The name of the route to generate.

params<Hash>

The params to use in the route generation.

fallback<Hash>

Parameters for generating a fallback URL.

Returns

String

The generated URL.

Alternatives

If name is a hash, it will be merged with params and passed on to generate_for_default_route along with fallback.



84
85
86
87
88
89
90
91
92
93
94
# File 'lib/merb-core/dispatch/router.rb', line 84

def generate(name, params = {}, fallback = {})
  if name.is_a? Hash
    return generate_for_default_route(name.merge(params), fallback)
  end
  name = name.to_sym
  unless @@named_routes.key? name
    raise "Named route not found: #{name}"
  else
    @@named_routes[name].generate(params, fallback)
  end
end

.generate_for_default_route(params, fallback) ⇒ Object

Generates a URL based on the default route scheme of “/:controller/:action/:id.:format”.

Parameters

params<Hash>

The primary parameters to create the route from (see below).

fallback<Hash>

Fallback parameters. Same options as params.

Options (params)

:controller<~to_s>

The controller name. Required.

:action<~to_s>

The action name. Required.

:id<~to_s>

The ID for use in the action.

:format<~to_s>

The format of the preferred response.

Returns

String

The generated URL.



112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
# File 'lib/merb-core/dispatch/router.rb', line 112

def generate_for_default_route(params, fallback)
  query_params = params.reject do |k,v|
    [:controller, :action, :id, :format].include?(k.to_sym)
  end

  controller = params[:controller] || fallback[:controller]
  raise "Controller Not Specified" unless controller
  url = "/#{controller}"

  if params[:action] || params[:id] || params[:format] || !query_params.empty?
    action = params[:action] || fallback[:action]
    raise "Action Not Specified" unless action
    url += "/#{action}"
  end
  if params[:id]
    url += "/#{params[:id]}"
  end
  if format = params[:format]
    format = fallback[:format] if format == :current
    url += ".#{format}"
  end
  unless query_params.empty?
    url += "?" + Merb::Request.params_to_query_string(query_params)
  end
  url
end

.prepare(first = [], last = []) {|Behavior.new({}, { :action => 'index' })| ... } ⇒ Object

Prepares new routes and adds them to existing routes.

Parameters

first<Array>

An array of routes to add before the generated routes.

last<Array>

An array of routes to add after the generated routes.

&block

A block that generates new routes.

Block parameters (&block)

new_behavior<Behavior>

Behavior for child routes.

Yields:

  • (Behavior.new({}, { :action => 'index' }))


45
46
47
48
49
50
# File 'lib/merb-core/dispatch/router.rb', line 45

def prepare(first = [], last = [], &block)
  @@routes = []
  yield Behavior.new({}, { :action => 'index' }) # defaults
  @@routes = first + @@routes + last
  compile
end

.prepend(&block) ⇒ Object

Prepends the generated routes to the current routes.

Parameters

&block

A block that generates new routes when yielded a new Behavior.



32
33
34
# File 'lib/merb-core/dispatch/router.rb', line 32

def prepend(&block)
  prepare([], @@routes, &block)
end