Class: ActionDispatch::Routing::RouteSet
- Inherits:
-
Object
- Object
- ActionDispatch::Routing::RouteSet
show all
- Defined in:
- lib/action_dispatch/routing/route_set.rb,
lib/action_dispatch/routing/deprecated_mapper.rb
Overview
Defined Under Namespace
Classes: Dispatcher, Generator, NamedRouteCollection
Constant Summary
collapse
- PARAMETERS_KEY =
'action_dispatch.request.path_parameters'
- RESERVED_OPTIONS =
[:anchor, :params, :only_path, :host, :protocol, :port, :trailing_slash]
- CONTROLLER_REGEXP =
/[_a-zA-Z0-9]+/
Instance Attribute Summary collapse
Class Method Summary
collapse
Instance Method Summary
collapse
-
#add_route(app, conditions = {}, requirements = {}, defaults = {}, name = nil, anchor = true) ⇒ Object
-
#call(env) ⇒ Object
-
#clear! ⇒ Object
-
#controller_constraints ⇒ Object
-
#draw(&block) ⇒ Object
-
#empty? ⇒ Boolean
-
#extra_keys(options, recall = {}) ⇒ Object
Generate the path indicated by the arguments, and return an array of the keys that were not used to generate it.
-
#finalize! ⇒ Object
-
#generate(options, recall = {}, extras = false) ⇒ Object
-
#generate_extras(options, recall = {}) ⇒ Object
-
#in_memory_controller_namespaces ⇒ Object
-
#initialize(request_class = ActionDispatch::Request) ⇒ RouteSet
constructor
A new instance of RouteSet.
-
#install_helpers(destinations = [ActionController::Base, ActionView::Base], regenerate_code = false) ⇒ Object
-
#recognize_path(path, environment = {}) ⇒ Object
-
#url_for(options) ⇒ Object
-
#url_helpers ⇒ Object
Constructor Details
#initialize(request_class = ActionDispatch::Request) ⇒ RouteSet
Returns a new instance of RouteSet.
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
|
# File 'lib/action_dispatch/routing/route_set.rb', line 216
def initialize(request_class = ActionDispatch::Request)
self.routes = []
self.named_routes = NamedRouteCollection.new
self.resources_path_names = self.class.default_resources_path_names.dup
self.controller_namespaces = Set.new
self.default_url_options = {}
self.request_class = request_class
self.valid_conditions = request_class.public_instance_methods.map { |m| m.to_sym }
self.valid_conditions.delete(:id)
self.valid_conditions.push(:controller, :action)
@disable_clear_and_finalize = false
clear!
end
|
Instance Attribute Details
#controller_namespaces ⇒ Object
Returns the value of attribute controller_namespaces.
8
9
10
|
# File 'lib/action_dispatch/routing/deprecated_mapper.rb', line 8
def controller_namespaces
@controller_namespaces
end
|
#default_url_options ⇒ Object
Returns the value of attribute default_url_options.
210
211
212
|
# File 'lib/action_dispatch/routing/route_set.rb', line 210
def default_url_options
@default_url_options
end
|
#disable_clear_and_finalize ⇒ Object
Returns the value of attribute disable_clear_and_finalize.
209
210
211
|
# File 'lib/action_dispatch/routing/route_set.rb', line 209
def disable_clear_and_finalize
@disable_clear_and_finalize
end
|
#named_routes ⇒ Object
Returns the value of attribute named_routes.
208
209
210
|
# File 'lib/action_dispatch/routing/route_set.rb', line 208
def named_routes
@named_routes
end
|
#request_class ⇒ Object
Returns the value of attribute request_class.
210
211
212
|
# File 'lib/action_dispatch/routing/route_set.rb', line 210
def request_class
@request_class
end
|
#resources_path_names ⇒ Object
Returns the value of attribute resources_path_names.
209
210
211
|
# File 'lib/action_dispatch/routing/route_set.rb', line 209
def resources_path_names
@resources_path_names
end
|
#routes ⇒ Object
Returns the value of attribute routes.
208
209
210
|
# File 'lib/action_dispatch/routing/route_set.rb', line 208
def routes
@routes
end
|
#set ⇒ Object
Returns the value of attribute set.
208
209
210
|
# File 'lib/action_dispatch/routing/route_set.rb', line 208
def set
@set
end
|
#valid_conditions ⇒ Object
Returns the value of attribute valid_conditions.
210
211
212
|
# File 'lib/action_dispatch/routing/route_set.rb', line 210
def valid_conditions
@valid_conditions
end
|
Class Method Details
.default_resources_path_names ⇒ Object
212
213
214
|
# File 'lib/action_dispatch/routing/route_set.rb', line 212
def self.default_resources_path_names
{ :new => 'new', :edit => 'edit' }
end
|
Instance Method Details
#add_route(app, conditions = {}, requirements = {}, defaults = {}, name = nil, anchor = true) ⇒ Object
303
304
305
306
307
308
309
310
|
# File 'lib/action_dispatch/routing/route_set.rb', line 303
def add_route(app, conditions = {}, requirements = {}, defaults = {}, name = nil, anchor = true)
raise ArgumentError, "Invalid route name: '#{name}'" unless name.blank? || name.to_s.match(/^[_a-z]\w*$/i)
route = Route.new(self, app, conditions, requirements, defaults, name, anchor)
@set.add_route(*route)
named_routes[name] = route if name
routes << route
route
end
|
#call(env) ⇒ Object
497
498
499
500
|
# File 'lib/action_dispatch/routing/route_set.rb', line 497
def call(env)
finalize!
@set.call(env)
end
|
#clear! ⇒ Object
253
254
255
256
257
258
259
260
261
262
263
|
# File 'lib/action_dispatch/routing/route_set.rb', line 253
def clear!
@controller_constraints = nil
@finalized = false
routes.clear
named_routes.clear
@set = ::Rack::Mount::RouteSet.new(
:parameters_key => PARAMETERS_KEY,
:request_class => request_class
)
end
|
#controller_constraints ⇒ Object
12
13
14
15
16
17
18
19
|
# File 'lib/action_dispatch/routing/deprecated_mapper.rb', line 12
def controller_constraints
@controller_constraints ||= begin
namespaces = controller_namespaces + in_memory_controller_namespaces
source = namespaces.map { |ns| "#{Regexp.escape(ns)}/#{CONTROLLER_REGEXP.source}" }
source << CONTROLLER_REGEXP.source
Regexp.compile(source.sort.reverse.join('|'))
end
end
|
#draw(&block) ⇒ Object
232
233
234
235
236
237
238
239
240
241
242
243
244
245
|
# File 'lib/action_dispatch/routing/route_set.rb', line 232
def draw(&block)
clear! unless @disable_clear_and_finalize
mapper = Mapper.new(self)
if block.arity == 1
mapper.instance_exec(DeprecatedMapper.new(self), &block)
else
mapper.instance_exec(&block)
end
finalize! unless @disable_clear_and_finalize
nil
end
|
#empty? ⇒ Boolean
299
300
301
|
# File 'lib/action_dispatch/routing/route_set.rb', line 299
def empty?
routes.empty?
end
|
Generate the path indicated by the arguments, and return an array of the keys that were not used to generate it.
451
452
453
|
# File 'lib/action_dispatch/routing/route_set.rb', line 451
def (options, recall={})
(options, recall).last
end
|
#finalize! ⇒ Object
247
248
249
250
251
|
# File 'lib/action_dispatch/routing/route_set.rb', line 247
def finalize!
return if @finalized
@finalized = true
@set.freeze
end
|
#generate(options, recall = {}, extras = false) ⇒ Object
459
460
461
|
# File 'lib/action_dispatch/routing/route_set.rb', line 459
def generate(options, recall = {}, = false)
Generator.new(options, recall, self, ).generate
end
|
455
456
457
|
# File 'lib/action_dispatch/routing/route_set.rb', line 455
def (options, recall={})
generate(options, recall, true)
end
|
#in_memory_controller_namespaces ⇒ Object
21
22
23
24
25
26
27
28
29
|
# File 'lib/action_dispatch/routing/deprecated_mapper.rb', line 21
def in_memory_controller_namespaces
namespaces = Set.new
ActionController::Base.descendants.each do |klass|
next if klass.anonymous?
namespaces << klass.name.underscore.split('/')[0...-1].join('/')
end
namespaces.delete('')
namespaces
end
|
#install_helpers(destinations = [ActionController::Base, ActionView::Base], regenerate_code = false) ⇒ Object
265
266
267
268
|
# File 'lib/action_dispatch/routing/route_set.rb', line 265
def install_helpers(destinations = [ActionController::Base, ActionView::Base], regenerate_code = false)
Array(destinations).each { |d| d.module_eval { include Helpers } }
named_routes.install(destinations, regenerate_code)
end
|
#recognize_path(path, environment = {}) ⇒ Object
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
|
# File 'lib/action_dispatch/routing/route_set.rb', line 502
def recognize_path(path, environment = {})
method = (environment[:method] || "GET").to_s.upcase
path = Rack::Mount::Utils.normalize_path(path) unless path =~ %r{://}
begin
env = Rack::MockRequest.env_for(path, {:method => method})
rescue URI::InvalidURIError => e
raise ActionController::RoutingError, e.message
end
req = @request_class.new(env)
@set.recognize(req) do |route, matches, params|
params.each do |key, value|
if value.is_a?(String)
value = value.dup.force_encoding(Encoding::BINARY) if value.encoding_aware?
params[key] = URI.unescape(value)
end
end
dispatcher = route.app
while dispatcher.is_a?(Mapper::Constraints) && dispatcher.matches?(env) do
dispatcher = dispatcher.app
end
if dispatcher.is_a?(Dispatcher) && dispatcher.controller(params, false)
dispatcher.prepare_params!(params)
return params
end
end
raise ActionController::RoutingError, "No route matches #{path.inspect}"
end
|
#url_for(options) ⇒ Object
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
|
# File 'lib/action_dispatch/routing/route_set.rb', line 465
def url_for(options)
finalize!
options = (options || {}).reverse_merge!(default_url_options)
handle_positional_args(options)
rewritten_url = ""
path_segments = options.delete(:_path_segments)
unless options[:only_path]
rewritten_url << (options[:protocol] || "http")
rewritten_url << "://" unless rewritten_url.match("://")
rewritten_url << rewrite_authentication(options)
raise "Missing host to link to! Please provide :host parameter or set default_url_options[:host]" unless options[:host]
rewritten_url << options[:host]
rewritten_url << ":#{options.delete(:port)}" if options.key?(:port)
end
path_options = options.except(*RESERVED_OPTIONS)
path_options = yield(path_options) if block_given?
path = generate(path_options, path_segments || {})
rewritten_url << (options[:trailing_slash] ? path.sub(/\?|\z/) { "/" + $& } : path)
rewritten_url << "##{Rack::Mount::Utils.escape_uri(options[:anchor].to_param.to_s)}" if options[:anchor]
rewritten_url
end
|
#url_helpers ⇒ Object
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
|
# File 'lib/action_dispatch/routing/route_set.rb', line 270
def url_helpers
@url_helpers ||= begin
routes = self
helpers = Module.new do
extend ActiveSupport::Concern
include UrlFor
@routes = routes
class << self
delegate :url_for, :to => '@routes'
end
extend routes.named_routes.module
included do
routes.install_helpers(self)
singleton_class.send(:define_method, :_routes) { routes }
end
define_method(:_routes) { routes }
end
helpers
end
end
|