lib/plezi/router/router.rb in plezi-0.14.4 vs lib/plezi/router/router.rb in plezi-0.14.5

- old
+ new

@@ -1,128 +1,135 @@ require 'plezi/router/route' require 'plezi/router/errors' require 'plezi/router/assets' require 'plezi/router/adclient' -require 'rack' module Plezi - module Base - module Router - @routes = [] - @app = nil + module Base + # this module is incharge of routing requests to the correct Controller. + module Router + @routes = [] + @app = nil - module_function + module_function - def new(app) - if app && app != call_method - puts 'Plezi as Middleware' - @app = app - end - Plezi.app - end + # Creates a new router + def new(app) + if app && app != call_method + puts 'Plezi as Middleware' + @app = app + end + Plezi.app + end - 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 + # called when an HTTP request had arrived + 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 - # returns the `call` method. Used repeatedly in middleware mode and only once in application mode. - def call_method - @call_method ||= Plezi::Base::Router.method(:call) - end + # returns the `call` method. Used repeatedly in middleware mode and only once in application mode. + def call_method + @call_method ||= Plezi::Base::Router.method(:call) + end - 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 + # 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. + 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 - def list - @routes - end + def list + @routes + end - 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 + # Returns the URL for requested controller method and paramerets. + 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 end - end - end + end end