require 'webrick' require "erb" require "../common/helper.rb" # niveau de mise au point à mettre à 1 pour avoir des une traces des appels dans la servlet DEBUG_LEVEL=0 # sortie d'un série de valeurs de variables évalués dans un certain binding (1ier paramètre) def debug(bnds,*vars) return if DEBUG_LEVEL==0 vars.each {|v| $stdout< AbcDef def camelize(first_letter = :upper) s=self.split('_').map{|w|w.capitalize}.join s=s[0,1].downcase+s[1..-1] if first_letter==:lower end # transformer une forme "chameau" en forme avec des soulignés, par exemple AbcDef => abc_def def underscore self[0,1].downcase+self[1..-1].gsub(/[A-Z]/){|m|"_"+m.downcase} end end # Servlet de base pour le service minirails class MiniRailsServlet < WEBrick::HTTPServlet::AbstractServlet # générer une page HTML pour une erreur def error_page(message) < Minirails: error

Minirails: error

#{message}

EOD end # traiter un contrôleur pour une action et des ids def process_controller(controller_name,action,ids) class_name = controller_name.capitalize+"Controller" file_name = class_name.underscore debug binding,"class_name","file_name" # appeler le contrôleur controller=nil controller_file_name = File.join("app","controllers",file_name+".rb") debug binding,"controller_name","action","ids","controller_file_name" if (File.exist?(controller_file_name)) # a-t-on un contrôleur load controller_file_name # force reload of the class !!! useful for debugging # hack from http://programming-in-paradise.blogspot.com/2006/01/constructing-ruby-class-instances-from.html controller = Kernel.const_get(class_name).new if (controller.respond_to? action) # does the controller process this action? if (ids.length>0) # must it be called with any parameter? controller.send(action,ids) else controller.send(action) end end end controller end # traiter la vue suite à un contrôleur en donnant l'action de rendu def process_view(controller,controller_name,rendering_action,resp) view_file_name = File.join("app","views",controller_name,rendering_action+".rhtml") debug binding,"view_file_name" if(File.exist?(view_file_name)) template = IO.read(view_file_name) rhtml=ERB.new(template) controller.content_for_layout=rhtml.result(controller.nil? ? nil : controller.get_binding) layout_file_name = File.join("app","views","layouts",controller_name+".rhtml") # traiter le fichier de layout s'il existe... debug binding,"layout_file_name","$do_layout" if($do_layout and File.exist?(layout_file_name)) template = IO.read(layout_file_name) rhtml=ERB.new(template) output=rhtml.result(controller.nil? ? nil : controller.get_binding) resp.body=output else resp.body=controller.content_for_layout end resp['content-type']="text/html" resp.cookies.replace($cookies) else resp.body=error_page("No view defined for #{rendering_action}"); end end # méthode qui traite le GET lors d'un traitement de l'URL def do_GET(req,resp) if (req.path_info.length>0) $stdout<<"*** #{req.request_line}" if DEBUG_LEVEL>0 return if req.request_line.chomp=="/favicon.ico" # ignorer les appels pour favicon.ico... debug binding, "req.query","req.query_string" $params = req.query $cookies = req.cookies $do_layout=true $rendering_action=nil # decoder l'url controller_name,action,*ids = req.path_info[1..-1].split("/") # vérifier s'il y a un controlleur et une action if(controller_name.nil?) resp.body=error_page("Vous devez au moins donner le nom d'un contrôleur dans l'url") return end action="index" if(action.nil?) # default action controller = process_controller(controller_name,action,ids) debug binding,"controller","$rendering_action" process_view(controller,controller_name,$rendering_action || action,resp) end end end