Обслуживание статических файлов с помощью Sinatra
У меня есть сайт на одной странице только с использованием HTML, CSS и JavaScript. Я хочу развернуть приложение в Heroku, но я не могу найти способ сделать это. Теперь я пытаюсь заставить приложение работать с 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
Без дополнительной настройки Sinatra будет обслуживать активы в public
. Для пустого маршрута вам нужно будет отобразить индексный документ.
require 'rubygems'
require 'sinatra'
get '/' do
File.read(File.join('public', 'index.html'))
end
Маршруты должны возвращать String
, которые становятся телом ответа HTTP. File.read
открывает файл, читает файл, закрывает файл и возвращает String
.
Ответ 2
Вы можете использовать помощник send_file
для обслуживания файлов.
require 'sinatra'
get '/' do
send_file File.join(settings.public_folder, 'index.html')
end
Это будет обслуживать index.html
из любой директории, настроенной как имеющей ваши статические файлы приложения.
Ответ 3
Вы можете просто разместить их из общей папки, и им не нужны маршруты.
.
-- 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 доступно из '/whatever/bla.html
Пример:
. /public/stylesheets/screen.css
Будет доступен через '/stylesheets/screen.css' не требуется маршрут
Ответ 4
Имейте в виду, что в процессе производства вы можете автоматически отправить ваш веб-сервер index.html
, чтобы запрос никогда не попадал на Sinatra. Это лучше для производительности, так как вам не нужно проходить через стек Sinatra/Rack, чтобы обслуживать статический текст, что и делает Apache/Nginx.
Ответ 5
Sinatra должна предоставлять вам статические файлы из общедоступного каталога как описано в документах:
Статические файлы
Статические файлы подаются из каталога. /public. Вы можете указать другое местоположение, установив параметр: public:
Обратите внимание, что имя общего каталога не включено в URL. Файл. /public/css/style.css доступен как example.com/css/style.css.
Ответ 6
sinatra-assetpack gem предлагает целую кучу функций. синтаксис сладкий:
serve '/js', from: '/app/javascripts'
в то время как у меня все еще возникают проблемы с конвейером ресурсов rails, я чувствую, что у меня гораздо больше контроля, используя sinatra-assetpack - но большую часть времени он просто работает с несколькими строками кода.
Ответ 7
ОБНОВЛЕННЫЙ ОТВЕТ:
Я связал все вышеперечисленное, не повезло, что я мог загружать содержимое css, js.... и т.д. Единственное, что загружалось, - 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 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
Ответ 8
Добавьте строку ниже в основной файл rb
set :public_folder, 'public'
Ответ 9
require 'rubygems'
require 'sinatra'
set :public_folder, File.dirname(__FILE__) + '/../client'
#client - it folder with all your file, including myapp.rb
get "/" do
File.read('index.html')
end
Ответ 10
Возможно, вам стоит переместить файл index.html
в views/index.erb
и определить конечную точку, например:
get '/' do
erb :index
end
Ответ 11
Помещение файлов в папку public
имеет ограничение. Фактически, когда вы находитесь в корневом каталоге '/'
, он работает правильно, потому что браузер установит относительный путь вашего файла css, например /css/style.css
, и синатра будет искать файл в каталоге public
. Однако, если ваше местоположение, например, /user/create
, тогда веб-браузер будет искать ваш файл css в /user/create/css/style.css
и будет сбой.
В качестве обходного пути я добавил следующее перенаправление для правильной загрузки файла css:
get %r{.*/css/style.css} do
redirect('css/style.css')
end
Ответ 12
Как насчет этого решения?
get "/subdirectory/:file" do
file = params[:file] + "index.html"
if File.exists?(params[:file])
return File.open("subdirectory/" + file)
else
return "error"
end
end
поэтому, если вы теперь перейдете на (например)/подкаталог/test/, он будет загружать подкаталог/test/index.html