2010-10-05 6 views
16

Sto cercando di ottenere alcune informazioni da questo tutorial: http://m.onkey.org/2008/11/18/ruby-on-rack-2-rack-builderRubino Rack - il montaggio di un semplice server web che legge index.html come predefinito

fondamentalmente voglio avere un file config.ru che raccontano cremagliera per leggere la corrente directory in modo da poter accedere a tutti i file come un semplice server Apache e leggere anche la root di default con il file index.html ... c'è un modo per farlo?

mio attuale config.ru assomiglia a questo:

run Rack::Directory.new('') 
#this would read the directory but it doesn't set the root to index.html 


map '/' do 
    file = File.read('index.html') 
    run Proc.new {|env| [200, {'Content-Type' => 'text/html'}, file] } 
end 
#using this reads the index.html mapped as the root but ignores the other files in the directory 

Quindi non so come procedere da qui ...

Ho anche provato questo seguendo l'esempio tutorial ma thin doesn' t inizia correttamente.

builder = Rack::Builder.new do 

    run Rack::Directory.new('') 

    map '/' do 
    file = File.read('index.html') 
    run Proc.new {|env| [200, {'Content-Type' => 'text/html'}, file] } 
    end 

end 

Rack::Handler::Thin.run builder, :port => 3000 

Grazie in anticipo

+0

FWIW, ': port => 3000' dovrebbe essere': Port => 3000' - nota la "P" maiuscola in Port. – briangonzalez

risposta

36

penso che ti manca il comando della rackup. Ecco come viene utilizzato:

rackup config.ru 

Questo eseguirà l'app per rack sulla porta 9292 utilizzando webrick. Puoi leggere "rackup - help" per maggiori informazioni su come modificare questi valori di default.

Informazioni sull'applicazione che si desidera creare. Ecco come penso che dovrebbe essere simile:

# This is the root of our app 
@root = File.expand_path(File.dirname(__FILE__)) 

run Proc.new { |env| 
    # Extract the requested path from the request 
    path = Rack::Utils.unescape(env['PATH_INFO']) 
    index_file = @root + "#{path}/index.html" 

    if File.exists?(index_file) 
    # Return the index 
    [200, {'Content-Type' => 'text/html'}, File.read(index_file)] 
    # NOTE: using Ruby >= 1.9, third argument needs to respond to :each 
    # [200, {'Content-Type' => 'text/html'}, [File.read(index_file)]] 
    else 
    # Pass the request to the directory app 
    Rack::Directory.new(@root).call(env) 
    end 
} 
+0

molto buono, questo è esattamente quello che volevo ottenere, penso di poter ottenere più informazioni da qui e saperne di più. Grazie mille valo – zanona

+1

Trovato per caso e ho pensato di aggiungere questo: [REQUEST_PATH è una variabile legacy completamente indefinita in Rack.] (Http://groups.google.com/group/rack-devel/ browse_thread/thread/0a41ecc3ce2db50d) –

+0

Esattamente quello di cui avevo bisogno. Grazie! – Mischa

8

È possibile farlo utilizzando Rack :: Statico

map "/foo" do 
    use Rack::Static, 
    :urls => [""], :root => File.expand_path('bar'), :index => 'index.html' 
    run lambda {|*|} 
end 
+0

questo ha risolto un problema enorme che stavo vivendo con file statici sotto Sinatra. Molte grazie! – Rots

1

Per me, utilizzando Rubino 2.0 e 1.5.2 Rack, sinm solution lavorato per servire il pagina indice (sia come pagina predefinita per root e caricata esplicitamente), ma per altri file sono ottenuti errori simili al seguente:

Rack::Lint::LintError: Status must be >=100 seen as integer 

ho combinato soluzione SINM con questo SO answer e t egli snippet trovato su Heroku documentation per ottenere il comportamento desiderato (supponendo che l'intero sito è contenuto in una cartella chiamata public):

9

sono finito in questa pagina alla ricerca di un uno di linea ...

Se invece si è al servizio della directory corrente per alcune attività una tantum, questo è tutto ciò che serve:

ruby -run -e httpd . -p 5000 

I dettagli su come funziona: http://www.benjaminoakes.com/2013/09/13/ruby-simple-http-server-minimalist-rake/

+1

È fantastico! – wejrowski

+1

Questo era un post eccezionale e dovrebbe avere il conteggio più alto in questo post. –

2

Il mio esempio per fare la stessa di seguito:

module Rack 
    class DirectoryIndex 
    def initialize(app) 
     @app = app 
    end 
    def call(env) 
     index_path = ::File.join($documentRoot, Rack::Request.new(env).path.split('/'), 'index.html') 
     if ::File.exists?(index_path) 
     return [200, {"Content-Type" => "text/html"}, [::File.read(index_path)]] 
     else 
     @app.call(env) 
     end 
    end 
    end 
end 

require 'rack_directory_index.rb' 

$documentRoot = File.expand_path(File.join(File.dirname(__FILE__), '..', '..', 'build')) 

Capybara.app = Rack::Builder.new do |builder| 
puts "Creating static rack server serving #{$documentRoot}" 
use Rack::DirectoryIndex 
    run Rack::Directory.new($documentRoot) 
end 

Capybara.configure do |config| 
    config.run_server = true 
end 

La soluzione è per lo più una copia e incolla da risposte diverse ma funziona bene.Puoi trovarlo come gist here aswell, buona fortuna

+0

Migliora la tua risposta con alcune informazioni dal tuo link. Le risposte non dovrebbero consistere solo in un link – user1781290

+0

Aggiornamento della risposta, grazie per il feedback –

Problemi correlati