Ruby Rack - монтирование простого веб-сервера, который по умолчанию читает index.html - PullRequest
18 голосов
/ 05 октября 2010

Я пытаюсь получить некоторую информацию из этого урока: http://m.onkey.org/2008/11/18/ruby-on-rack-2-rack-builder

В основном я хочу, чтобы у меня был файл config.ru, который указывает стойке читать текущий каталог, чтобы я мог получить доступ ко всем файлам так же, как к простому серверу Apache, а также прочитать корневой каталог по умолчанию с файлом index.html ... Есть ли способ сделать это?

мой текущий config.ru выглядит так:

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

Так что я не знаю, как действовать отсюда ...

Я также попробовал это, следуя примеру с учебниками, но thin не запускается должным образом.

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

Заранее спасибо

Ответы [ 5 ]

37 голосов
/ 14 октября 2010

Я думаю, что вам не хватает команды rackup.Вот как это используется:

rackup config.ru

Это будет запускать приложение стойки на порту 9292 с помощью webrick.Вы можете прочитать "rackup --help" для получения дополнительной информации о том, как вы можете изменить эти значения по умолчанию.

О приложении, которое вы хотите создать.Вот как я думаю, это должно выглядеть так:

# 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
}
9 голосов
/ 13 сентября 2013

Я попал на эту страницу в поисках одной строки ...

Если все, что вам нужно, это обслуживать текущий каталог для нескольких разовых задач, это все, что вам нужно:

ruby -run -e httpd . -p 5000

Подробности о том, как это работает: http://www.benjaminoakes.com/2013/09/13/ruby-simple-http-server-minimalist-rake/

8 голосов
/ 31 июля 2012

Вы можете сделать это, используя Rack :: Static

map "/foo" do
  use Rack::Static, 
    :urls => [""], :root => File.expand_path('bar'), :index => 'index.html'
  run lambda {|*|}
end
2 голосов
/ 30 сентября 2014

Мой пример того же действия приведен ниже:

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

Решение в основном состоит из копирования и вставки из разных ответов, но оно отлично работает.Вы можете найти это как суть здесь также , удачи

1 голос
/ 28 апреля 2013

Для меня, используя Ruby 2.0 и Rack 1.5.2, sinm solution работал для обслуживания страницы индекса (как страницы по умолчанию для root и явно загруженной), но для других файлов я получил ошибки, подобныеследующее:

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

Я объединил решение sinm с этим SO ответом и фрагментом, найденным в Документация Heroku , чтобы получить желаемое поведение (при условии, что весь сайтсодержится в папке с именем public):

use Rack::Static, 
  :urls => ["/images", "/js", "/css"],
  :root => "public",
  :index => 'index.html'

run Rack::File.new("public")
...