module Plezi::Base::Router

this module is incharge of routing requests to the correct Controller.

Public Instance Methods

call(env) click to toggle source

called when an HTTP request had arrived

# File lib/plezi/router/router.rb, line 25
def call(env)
   request = Rack::Request.new(env)
   response = Rack::Response.new
   ret = nil
   @routes.each { |route| ret = route.call(request, response); break if ret }
   unless ret
      return @app.call(env) if @app
      ret = ::Plezi::Base::Err404Ctrl.new._pl_respond(request, response, request.params)
   end
   response.write(ret) if ret.is_a?(String)
   return response.finish
rescue => e
   puts e.message, e.backtrace
   response = Rack::Response.new
   response.write ::Plezi::Base::Err500Ctrl.new._pl_respond(request, response, request.params)
   return response.finish
end
call_method() click to toggle source

returns the `call` method. Used repeatedly in middleware mode and only once in application mode.

# File lib/plezi/router/router.rb, line 44
def call_method
   @call_method ||= Plezi::Base::Router.method(:call)
end
list() click to toggle source
# File lib/plezi/router/router.rb, line 67
def list
   @routes
end
new(app) click to toggle source

Creates a new router

# File lib/plezi/router/router.rb, line 16
def new(app)
   if app && app != call_method
      puts "Plezi #{ Plezi::VERSION } as Middleware"
      @app = app
   end
   Plezi.app
end
route(path, controller) click to toggle source

Creates a new route.

`path`

should be a string describing the route. Named parameters are allowed.

`controller`

should be a Class object that will receive all the class properties of a Plezi Controller, or one of the allowed keywords.

# File lib/plezi/router/router.rb, line 52
def route(path, controller)
   path = path.chomp('/'.freeze) unless path == '/'.freeze
   case controller
   when :client
      controller = ::Plezi::Base::Router::ADClient
   when :assets
      controller = ::Plezi::Base::Assets
      path << '/*'.freeze unless path[-1] == '*'.freeze
   when Regexp
      path << '/*'.freeze unless path[-1] == '*'.freeze
      return @routes << RouteRewrite.new(path, controller)
   end
   @routes << Route.new(path, controller)
end
url_for(controller, method_sym, params = {}) click to toggle source

Returns the URL for requested controller method and paramerets.

# File lib/plezi/router/router.rb, line 72
def url_for(controller, method_sym, params = {})
   # GET,PUT,POST,DELETE
   r = nil
   url = '/'.dup
   @routes.each do |tmp|
      case tmp.controller
      when Class
         next if tmp.controller != controller
         r = tmp
         break
      when Regexp
         nm = nil
         nm = tmp.param_names[0] if params[tmp.param_names[0]]
         nm ||= tmp.param_names[0].to_sym
         url << "#{params.delete nm}/" if params[nm] && params[nm].to_s =~ tmp.controller
      else
         next
      end
   end
   return nil if r.nil?
   case method_sym.to_sym
   when :new
      params.delete :id
      params.delete :_method
      params.delete '_method'.freeze
      params['id'.freeze] = :new
   when :create
      params['id'.freeze] = :new
      params.delete :id
      params['_method'.freeze] = :post
      params.delete :_method
   when :update
      params.delete :_method
      params['_method'.freeze] = :put
   when :delete
      params.delete :_method
      params['_method'.freeze] = :delete
   when :index
      params.delete 'id'.freeze
      params.delete '_method'.freeze
      params.delete :id
      params.delete :_method
   when :show
      raise "The URL for ':show' MUST contain a valid 'id' parameter for the object's index to display." unless params['id'.freeze].nil? && params[:id].nil?
      params.delete '_method'.freeze
      params.delete :_method
   else
      params.delete :id
      params['id'.freeze] = method_sym
   end
   names = r.param_names
   url.chomp! '/'.freeze
   url << r.prefix
   url.clear if url == '/'.freeze
   while names.any? && params[name[0]]
      url << "/#{Rack::Utils.escape params[names.shift]}"
   end
   url << '/'.freeze if url.empty?
   (url << '?') << Rack::Utils.build_nested_query(params) if params.any?
   url
end