Обслуживание статических файлов с помощью 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