class RouteObject

Public Class Methods

new() click to toggle source
# File lib/rhino/routing.rb, line 2
def initialize
  @rules = []
end

Public Instance Methods

check_url(url) click to toggle source
# File lib/rhino/routing.rb, line 40
def check_url(url)
  @rules.each do |r|
    m = r[:regexp].match(url)

    if m
      options = r[:options]
      params = options[:default].dup
      r[:vars].each_with_index do |v, i|
        params[v] = m.captures[i]
      end
      dest = nil
      if r[:dest]
        return get_dest(r[:dest], params)
      else
        controller = params["controller"]
        action = params["action"]
        return get_dest("#{controller}" +
          "##{action}", params)
      end
    end
  end

  nil
end
get_dest(dest, routing_params = {}) click to toggle source
# File lib/rhino/routing.rb, line 65
def get_dest(dest, routing_params = {})
  return dest if dest.respond_to?(:call)
  if dest =~ /^([^#]+)#([^#]+)$/
    name = $1.capitalize
    cont = Object.const_get("#{name}Controller")
    return cont.action($2, routing_params)
  end
  raise "No destination: #{dest.inspect}!"
end
match(url, *args) click to toggle source
# File lib/rhino/routing.rb, line 6
def match(url, *args)
  options = {}
  options = args.pop if args[-1].is_a?(Hash)
  options[:default] ||= {}

  dest = nil
  dest = args.pop if args.size > 0
  raise "Too many args!" if args.size > 0

  parts = url.split("/")
  parts.select! { |p| !p.empty? }

  vars = []
  regexp_parts = parts.map do |part|
    if part[0] == ":"
      vars << part[1..-1]
      "([a-zA-Z0-9]+)"
    elsif part[0] == "*"
      vars << part[1..-1]
      "(.*)"
    else
      part
    end
  end

  regexp = regexp_parts.join("/")
  @rules.push({
    :regexp => Regexp.new("^/#{regexp}$"),
    :vars => vars,
    :dest => dest,
    :options => options,
  })
end