2010-03-13 2 views
133

У меня есть сайт на одной странице только с использованием HTML, CSS и JavaScript. Я хочу развернуть приложение в Heroku, но я не могу найти способ сделать это. Теперь я пытаюсь заставить приложение работать с Sinatra.Обслуживание статических файлов с помощью Sinatra

. 
|-- application.css 
|-- application.js 
|-- index.html 
|-- jquery.js 
`-- myapp.rb 

И следующее содержание myapp.rb.

require 'rubygems' 
require 'sinatra' 

get "/" do 
    # What should I write here to point to the `index.html` 
end 
+1

Я узнал, что работает доступ к http: // localhost: 2345/index.html. –

+0

Вы можете использовать WebBrick для обслуживания статических файлов в нескольких строках. 'require 'webrick'; server = WEBrick :: HTTPServer.new Порт: 1234; сервер.mount '/', WEBrick :: HTTPServlet :: FileHandler, 'www /'; trap ("INT") {server.stop}; server.start; 'Затем запустите' ruby ​​myapp.rb'. Удалите порт для Heroku. Поместите 'web: ruby ​​myapp.rb' в свой' Procfile'. Комментарий не отвечает, поскольку это не для Синатры, но я думаю, что это упрощает зависимости. – Chloe

ответ

121

Без каких-либо дополнительных настроек, Sinatra будет обслуживать активы в public. Для пустого маршрута вам нужно будет отобразить индексный документ.

require 'rubygems' 
require 'sinatra' 

get '/' do 
    File.read(File.join('public', 'index.html')) 
end 

Маршруты должны вернуть String, который станет телом ответа HTTP. File.read открывает файл, считывает файл, закрывает файл и возвращает String.

+51

Вы должны скорее отправить 'send_file File.expand_path ('index.html', settings.public)'. –

+31

Это неверно. Вы должны заменить 'settings.public' на' settings.public_folder', чтобы получить 'send_file File.expand_path ('index.html', settings.public_folder)' – alistairholt

+0

, поэтому какой метод prferrable: send_file или File.read? – zhirzh

-7

Как насчет этого решения? :

get "/subdirectory/:file" do 
    file = params[:file] + "index.html" 
    if File.exists?(params[:file]) 
    return File.open("subdirectory/" + file) 
    else 
    return "error" 
    end 
end 

так что если вы в настоящее время перейти к (например)/поддиректории/тест/она будет загружать подкаталог/тест/index.html

10

Синатра должен позволить вам служить статические файлы из общего каталога as explained in the docs:

статические файлы

Статические файлы подаются из ./public каталога. Вы можете указать другое местоположение, установив опцию: public:

Обратите внимание, что имя общего каталога не включено в URL-адрес. Файл ./public/css/style.css доступен в виде example.com/css/style.css.

+4

Почему у этого есть 4 голоса? Он не отвечает на вопрос о том, как представить документ по умолчанию при запросе папки. –

11

Имейте в виду, что в процессе производства вы можете автоматически отправить свой веб-сервер index.html, чтобы запрос никогда не попадал на Синатру. Это лучше для производительности, так как вам не нужно проходить через стек Sinatra/Rack, чтобы обслуживать статический текст, что и делает Apache/Nginx.

+0

О да, дух. Я просто использую Erb и использую Varnish, чтобы нажиться на нем. – ma11hew28

+2

Как вы настраиваете это в процессе производства? Я искал документацию об этой перекрестной ссылке с Sinatra и Rack, но не могу ее найти. В основном я хочу, чтобы index.html загружался в любую/общедоступную папку, в которой есть один, если пользователь ставит только имя папки –

160

Вы можете использовать вспомогательный помощник send_file для подачи файлов.

require 'sinatra' 

get '/' do 
    send_file File.join(settings.public_folder, 'index.html') 
end 

Это будет служить index.html из того каталога, был настроен как имеющие статические файлы вашего приложения.

+18

. Я думаю, что более новые приложения Sinatra используют 'set: public_folder', поэтому вы должны использовать' settings.public_folder' вместо ' settings.public' – Andrew

+3

Я обновил ответ, чтобы использовать settings.public_folder. Старые приложения могут по-прежнему использовать settings.public. –

57

Вы можете просто разместить их в общей папке, и им не нужны маршруты.

. 
-- myapp.rb 
`-- public 
    |-- application.css 
    |-- application.js 
    |-- index.html 
    `-- jquery.js 

В myapp.rb

set :public_folder, 'public' 

get "/" do 
    redirect '/index.html' 
end 

Ссылка на какую-то подпапку в общественном

set :public_folder, 'public' 
get "/" do 
    redirect '/subfolder/index.html' 
end 

Все в ./public доступен из «/ любой/л.HTML

Пример:
./public/stylesheets/screen.css
Будет доступно через «/stylesheets/screen.css» маршрута не требуется

+1

Что делать, если у публики много вложенных папок (для которых вы не хотите создавать маршруты), у которых есть файлы index.html, которые вы хотели бы по умолчанию? –

+0

Я расширил решение. Я надеюсь, что это поможет прояснить, все доступно публично, никакой маршрут не требуется просто опустить «общественную» часть пути. – Morgan

+1

используя rawnup на Heroku Мне пришлось использовать 'set: public_folder, 'public''. Это было ключом к тому, чтобы заставить его работать, несмотря на документацию Sinatra, подразумевающую, что это уже установлено как значение по умолчанию. –

2

sinatra-assetpack камня предлагает целую кучу возможностей. Синтаксис сладок:

serve '/js', from: '/app/javascripts' 

в то время как я все еще возникают проблемы с трубопроводом Рельсы активов я чувствую, что у меня есть намного больше контроля с использованием sinatra-assetpack - но в большинстве случаев это просто работает с несколькими строками кода.

1

Вы могли бы рассмотреть вопрос о переносе файла index.html в views/index.erb, и определение конечной точки, как:

get '/' do 
    erb :index 
end 
0

Запись файлов в папке public имеет ограничение. Фактически, когда вы находитесь в корне '/', путь работает правильно, потому что браузер установит относительный путь вашего файла css, например /css/style.css, и sinatra будет искать файл в каталоге public. Однако, если ваше местоположение, например, /user/create, тогда веб-браузер будет искать ваш файл css в /user/create/css/style.css и будет работать с ошибкой.

В качестве обходного пути, я добавил следующее Перенаправление правильно загрузить файл CSS:

get %r{.*/css/style.css} do 
    redirect('css/style.css') 
end 
2

ОБНОВЛЕНО ОТВЕТ: Я привязал все выше, не повезло бытия ablle для загрузки CSS, JS .. Содержимое .etc единственное, что загружалось, - index.html ... и остальные собирались = >>404 error

Мое решение: папка приложения выглядит так.

index.rb == >> Код Sinatra идет.

require 'rubygems' 
require 'sinatra' 

get '/' do 
    html :index 
end 

def html(view) 
    File.read(File.join('public', "#{view.to_s}.html")) 
end 

public folder == >> содержит все остальное ... CSS, JS, бла blah..etc.

[email protected]:~/sintra1$ ls 
index.rb public 
[email protected]:~/sintra1$ find public/ 
public/ 
public/index.html 
public/about_us.html 
public/contact.html 
public/fonts 
public/fonts/fontawesome-webfont.svg 
public/fonts/fontawesome-webfont.ttf 
public/img 
public/img/drink_ZIDO.jpg 
public/js 
public/js/bootstrap.min.js 
public/js/jquery.min.js 
public/js/bootstrap.js 
public/carsoul2.html 
public/css 
public/css/font-awesome-ie7.css 
public/css/bootstrap.min.css 
public/css/font-awesome.min.css 
public/css/bootstrap.css 
public/css/font-awesome.css 
public/css/style.css 
[email protected]:~/sintra1$ 

Теперь запустите сервер, и вы сможете без проблем перемещаться по статическим страницам.

[email protected]:~/sintra1$ ruby index.rb 
== Sinatra/1.4.5 has taken the stage on 4567 for development with backup from Thin 
>> Thin web server (v1.5.1 codename Straight Razor) 
>> Maximum connections set to 1024 
>> Listening on localhost:4567, CTRL+C to stop 
2

Добавить ниже линии в главном файле гь

set :public_folder, 'public' 
2
require 'rubygems' 
require 'sinatra' 

set :public_folder, File.dirname(__FILE__) + '/../client' 
#client - it's folder with all your file, including myapp.rb 

get "/" do 
    File.read('index.html') 
end 
Смежные вопросы