mirror of
https://github.com/rails/rails.git
synced 2022-11-09 12:12:34 -05:00
59296ab26d
Signed-off-by: Santiago Pastorino <santiago@wyeworks.com>
60 lines
1.7 KiB
Ruby
60 lines
1.7 KiB
Ruby
module ActionDispatch
|
|
module Routing
|
|
class Route #:nodoc:
|
|
attr_reader :app, :conditions, :defaults, :name
|
|
attr_reader :path, :requirements, :set
|
|
|
|
def initialize(set, app, conditions, requirements, defaults, name, anchor)
|
|
@set = set
|
|
@app = app
|
|
@defaults = defaults
|
|
@name = name
|
|
|
|
@requirements = requirements.merge(defaults)
|
|
@requirements.delete(:controller) if @requirements[:controller].is_a?(Regexp)
|
|
@requirements.delete_if { |k, v|
|
|
v == Regexp.compile("[^#{SEPARATORS.join}]+")
|
|
}
|
|
|
|
if path = conditions[:path_info]
|
|
@path = path
|
|
conditions[:path_info] = ::Rack::Mount::Strexp.compile(path, requirements, SEPARATORS, anchor)
|
|
end
|
|
|
|
@conditions = Hash[conditions.map { |k,v| [k, Rack::Mount::RegexpWithNamedGroups.new(v)] }]
|
|
@conditions.delete_if{ |k,v| k != :path_info && !valid_condition?(k) }
|
|
@requirements.delete_if{ |k,v| !valid_condition?(k) }
|
|
end
|
|
|
|
def verb
|
|
if method = conditions[:request_method]
|
|
case method
|
|
when Regexp
|
|
method.source.upcase
|
|
else
|
|
method.to_s.upcase
|
|
end
|
|
end
|
|
end
|
|
|
|
def segment_keys
|
|
@segment_keys ||= conditions[:path_info].names.compact.map { |key| key.to_sym }
|
|
end
|
|
|
|
def to_a
|
|
[@app, @conditions, @defaults, @name]
|
|
end
|
|
|
|
def to_s
|
|
@to_s ||= begin
|
|
"%-6s %-40s %s" % [(verb || :any).to_s.upcase, path, requirements.inspect]
|
|
end
|
|
end
|
|
|
|
private
|
|
def valid_condition?(method)
|
|
segment_keys.include?(method) || set.valid_conditions.include?(method)
|
|
end
|
|
end
|
|
end
|
|
end
|