2010-10-05 10 views
16

Estoy tratando de obtener información de este tutorial: http://m.onkey.org/2008/11/18/ruby-on-rack-2-rack-builderRubí Rack - montar un servidor web simple que lee index.html por defecto

básicamente quiero tener un archivo config.ru que diga estante para leer la corriente directorio para que pueda acceder a todos los archivos como un simple servidor apache y también leer la raíz predeterminada con el archivo index.html ... ¿hay alguna manera de hacerlo?

mi actual config.ru se parece a esto:

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 

Así que no sé cómo proceder de aquí ...

También he probado esta siguiendo el ejemplo tutoriales pero thin doesn' t comienza correctamente

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 

Gracias de antemano

+0

FWIW, ': port => 3000' debe ser': Port => 3000' - tenga en cuenta la "P" mayúscula en el puerto. – briangonzalez

Respuesta

36

creo que se echa en falta el comando del rackup. Así es como se usa:

rackup config.ru 

Esto ejecutará su aplicación de rack en el puerto 9292 usando webrick. Puede leer "rackup --help" para obtener más información sobre cómo puede cambiar estos valores predeterminados.

Acerca de la aplicación que desea crear. Así es como yo creo que debe ser similar:

# 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

muy bueno, eso es exactamente lo que quería lograr, creo que puedo obtener más información desde aquí y obtener más información al respecto. Muchas gracias – zanona

+1

Encontré esto por casualidad y pensé que agregaría esto: [REQUEST_PATH es una variable heredada que está completamente indefinida en Rack.] (Http://groups.google.com/group/rack-devel/ browse_thread/thread/0a41ecc3ce2db50d) –

+0

Exactamente lo que necesitaba. ¡Gracias! – Mischa

8

Usted puede hacer esto utilizando estante estático ::

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

esto ha resuelto un problema masivo que estaba experimentando con los archivos estáticos en Sinatra. ¡Muchas gracias! – Rots

1

Para mí, el uso de Ruby 2.0 y 1.5.2 en rack, sinm solution trabajaban para servir a la página de índice (tanto como página por defecto para la raíz y se cargaron de forma explícita), pero para otros archivos I obtuvieron errores similares a los siguientes:

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

combiné solución sinm con este SO answer y t que snippet encontrar en Heroku documentation para obtener el comportamiento deseado (suponiendo que todo el sitio está contenido en una carpeta llamada public):

9

terminé en esta página en busca de un chiste ...

Si lo que quieres es para servir al directorio actual para algunas tareas puntuales, esto es todo lo que necesita:

ruby -run -e httpd . -p 5000 

detalles sobre cómo funciona: http://www.benjaminoakes.com/2013/09/13/ruby-simple-http-server-minimalist-rake/

+1

¡Esto es asombroso! – wejrowski

+1

Esta fue una publicación sobresaliente y debería tener el recuento más alto en esta publicación. –

2

Mi ejemplo para hacer exactamente el mismo a continuación:

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 solución es sobre todo un copiar y pegar desde diferentes respuestas, pero funciona bien.Puede encontrarlo como gist here aswell, buena suerte

+0

Mejore su respuesta con información de su enlace. Las respuestas no solo deben consistir en un enlace – user1781290

+0

Actualizada la respuesta, gracias por los comentarios –

Cuestiones relacionadas