2012-11-05 7 views
5

Ich schreibe eine einfache statische Rack App. Überprüfen Sie den Code config.ru aus unter:Rack: Wie speichern Sie die URL als Variable?

use Rack::Static, 
    :urls => ["/elements", "/img", "/pages", "/users", "/css", "/js"], 
    :root => "archive" 


map '/' do 
    run Proc.new { |env| 
    [ 
     200, 
     { 
     'Content-Type' => 'text/html', 
     'Cache-Control' => 'public, max-age=6400' 
     }, 
     File.open('archive/splash.html', File::RDONLY) 
    ] 
    } 
end 

map '/pages/search.html' do 
    run Proc.new { |env| 
    [ 
     200, 
     { 
     'Content-Type' => 'text/html', 
     'Cache-Control' => 'public, max-age=6400' 
     }, 
     File.open('archive/pages/search.html', File::RDONLY) 
    ] 
    } 
end 

map '/pages/user.html' do 
    run Proc.new { |env| 
    [ 
     200, 
     { 
     'Content-Type' => 'text/html', 
     'Cache-Control' => 'public, max-age=6400' 
     }, 
     File.open('archive/pages/user.html', File::RDONLY) 
    ] 
    } 
end 

# Each map section is repeated for each HTML page served 

Ich möchte dies vereinfachen, indem die URL als Variable zu speichern und die Erstellung eines Kartenausschnittes, die

map url do 
    run Proc.new { |env| 
    [ 
     200, 
     { 
     'Content-Type' => 'text/html', 
     'Cache-Control' => 'public, max-age=6400' 
     }, 
     File.open('archive' + url, File::RDONLY) 
    ] 
    } 
end 

sagt Wie kann ich diese URL richtig eingestellt Variable?

Antwort

4

Sie sollten den Kartenteil nicht benötigen.

run Proc.new { |env| 
    [ 
    200, 
    { 
     'Content-Type' => 'text/html', 
     'Cache-Control' => 'public, max-age=6400' 
    }, 
    File.open('archive' + env['PATH_INFO'], File::RDONLY) 
    ] 
} 
+0

Das funktioniert dank –

+0

beachten Sie, dass diese den Content-Typ festgelegt wird 'text/html' für was auch immer Datei findet es auch 'robots.txt' oder " favicon.ico '. Aber ich denke, du kannst diese Linie immer verlassen und den Browser raten lassen. – rbp

5

Wie wäre:

static_page_mappings = { 
    '/'     => 'archive/splash.html', 
    '/pages/search.html' => 'archive/pages/search.html' 
    '/pages/user.html' => 'archive/pages/user.html', 
} 

static_page_mappings.each do |req, file| 
    map req do 
    run Proc.new { |env| 
     [ 
     200, 
     { 
      'Content-Type' => 'text/html', 
      'Cache-Control' => 'public, max-age=6400', 
     }, 
     File.open(file, File::RDONLY) 
     ] 
    } 
    end 
end 
+0

Haben Sie diesen Vorschlag nicht versucht, aber es kann funktionieren, danke! –

+0

Siehe meinen Kommentar in Erics Post, re Content-type – rbp