<source id="4vppl"><ins id="4vppl"></ins></source>
<u id="4vppl"><sub id="4vppl"><label id="4vppl"></label></sub></u>
<object id="4vppl"></object>
  • <u id="4vppl"><li id="4vppl"><label id="4vppl"></label></li></u>

    <object id="4vppl"></object>
    <b id="4vppl"><sub id="4vppl"><tr id="4vppl"></tr></sub></b>

      <i id="4vppl"><thead id="4vppl"></thead></i>

      <thead id="4vppl"><li id="4vppl"><label id="4vppl"></label></li></thead>

      當前位置:首頁 > 網站舊欄目 > 學習園地 > 設計軟件教程 > rack和actionpack的map對比

      rack和actionpack的map對比
      2010-01-13 23:02:40  作者:  來源:
      簡單的rackup配置
      Ruby代碼 復制代碼
      1. infinity = Proc.new {|env| [200, {"Content-Type" => "text/html"}, env.inspect]}   
      2. use Rack::CommonLogger   
      3. use Rack::ShowExceptions   
      4.   
      5. map '/' do  
      6.   run infinity   
      7. end  
      8.   
      9. map '/version' do  
      10.   map '/' do  
      11.     run Proc.new {|env| [200, {"Content-Type" => "text/html"}, "infinity 0.1"] }   
      12.   end  
      13.   
      14.   map '/last' do  
      15.     run Proc.new {|env| [200, {"Content-Type" => "text/html"}, Rack::Request.new(env).params.inspect] }   
      16.   end  
      17. end  

      執行先安裝rack gem install rack
      使用 rackup -R infinity.ru -p 3000

      其中map的寫法和routes.rb中做法差不多,回顧一下routes.rb中的寫法。
      Ruby代碼 復制代碼
      1. ActionController::Routing::Routes.draw do |map|   
      2.   map.connect ':controller/:action/:id'  
      3. end  

      routes.rb里面發生了什么呢?很不幸、里面過程錯綜復雜,橫跨了至少四個類Builder,Mapper,Route,RouteSet,我只能告訴你結果,一句map.connect生成了一個Route對象。

      rack代碼則簡單的我可以輕易的討論。
      Ruby代碼 復制代碼
      1. module Rack   
      2.   ...   
      3.   
      4.   class Builder   
      5.     def initialize(&block)   
      6.       @ins = []   
      7.       instance_eval(&block) if block_given?   
      8.     end  
      9.   
      10.     ...   
      11.     def map(path, &block)   
      12.       if @ins.last.kind_of? Hash  
      13.         @ins.last[path] = self.class.new(&block).to_app   
      14.       else  
      15.         @ins << {}   
      16.         map(path, &block)   
      17.       end  
      18.     end  
      19.   
      20.     def to_app   
      21.       @ins[-1] = Rack::URLMap.new(@ins.last)  if Hash === @ins.last   
      22.       inner_app = @ins.last   
      23.       @ins[0...-1].reverse.inject(inner_app) { |a, e| e.call(a) }   
      24.     end  
      25.     ...   
      26.   
      27.   end  
      28. end  
      29.   
      30. module Rack   
      31.   ...   
      32.   
      33.   class URLMap   
      34.     def initialize(map)   
      35.       @mapping = map.map { |location, app|   
      36.         if location =~ %r{\Ahttps?://(.*?)(/.*)}   
      37.           host, location = $1$2  
      38.         else  
      39.           host = nil  
      40.         end  
      41.   
      42.         unless location[0] == ?/   
      43.           raise ArgumentError, "paths need to start with /"  
      44.         end  
      45.         location = location.chomp('/')   
      46.   
      47.         [host, location, app]   
      48.       }.sort_by { |(h, l, a)| [-l.size, h.to_s.size] }  # Longest path first   
      49.     end  
      50.   
      51.     ...   
      52.   end  
      53. end  


      注意[0...-1]是不包含-1這個元素的,所以to_app只執行了前兩句。map最終生成了一個url和Rack::URLMap對象的Hash。而在rails當中,url被切割成了多個segments。Rails這樣作也自有其用處,常見的redirect_to :action => 'action'就是這樣構造出url的,但是對于輕量級應用,就有一點大炮打蚊子了。
      安徽新華電腦學校專業職業規劃師為你提供更多幫助【在線咨詢
      国产午夜福三级在线播放_亚洲精品成a人片在线观看_亚洲自慰一区二区三区_久久棈精品久久久久久噜噜
      <source id="4vppl"><ins id="4vppl"></ins></source>
      <u id="4vppl"><sub id="4vppl"><label id="4vppl"></label></sub></u>
      <object id="4vppl"></object>
    1. <u id="4vppl"><li id="4vppl"><label id="4vppl"></label></li></u>

      <object id="4vppl"></object>
      <b id="4vppl"><sub id="4vppl"><tr id="4vppl"></tr></sub></b>

        <i id="4vppl"><thead id="4vppl"></thead></i>

        <thead id="4vppl"><li id="4vppl"><label id="4vppl"></label></li></thead>
        一本热在线观看视频 | 精品99国产视频 | 中文字幕亚洲精品第十页 | 亚洲人成日韩中文字幕不卡 | 中文在线中文国产精品一 | 亚洲免费视频免在线观看 |