У меня есть одностраничный веб-сайт, использующий только 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
require 'webrick'; server = WEBrick::HTTPServer.new Port: 1234; server.mount '/', WEBrick::HTTPServlet::FileHandler, 'www/'; trap("INT") { server.stop }; server.start;
Тогда бегиruby myapp.rb
. Удалите порт для Heroku. Вставьтеweb: ruby myapp.rb
свойProcfile
. Комментарий не ответ, так как он не для Sinatra, но я думаю, что он упрощает зависимости.Ответы:
Без дополнительной настройки Sinatra будет обслуживать активы в формате
public
. Для пустого маршрута вы захотите отобразить индексный документ.require 'rubygems' require 'sinatra' get '/' do File.read(File.join('public', 'index.html')) end
Маршруты должны возвращать,
String
который становится телом HTTP-ответа.File.read
открывает файл, читает файл, закрывает файл и возвращаетString
.источник
send_file File.expand_path('index.html', settings.public)
.settings.public
на,settings.public_folder
чтобы получитьsend_file File.expand_path('index.html', settings.public_folder)
send_file
, он делает для вас лишние вещи github.com/sinatra/sinatra/blob/master/lib/sinatra/base.rb#L351File.read
читает весь файл в память. Это может быть нормально или нет, в зависимости от размера файлов и количества одновременных запросов.Вы можете использовать
send_file
помощник для обслуживания файлов.require 'sinatra' get '/' do send_file File.join(settings.public_folder, 'index.html') end
Это будет служить
index.html
из любого каталога, в котором хранятся статические файлы вашего приложения.источник
set :public_folder
, поэтому вы бы использовалиsettings.public_folder
вместоsettings.public
Вы можете просто разместить их из общей папки, и им не нужны маршруты.
. -- 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', маршрут не требуется
источник
set :public_folder, 'public'
. Это было ключом к его работе, несмотря на то, что документация Sinatra подразумевала, что это уже было установлено по умолчанию.Имейте в виду, что в процессе производства вы можете настроить
index.html
автоматическую отправку веб-сервера, чтобы запрос никогда не попал в Sinatra. Это лучше для производительности, так как вам не нужно проходить через стек Sinatra / Rack только для обслуживания статического текста, в чем Apache / Nginx отлично справляются.источник
Sinatra должна позволить вам обслуживать статические файлы из общедоступного каталога, как описано в документации :
источник
Добавьте строку ниже в основной файл rb
set :public_folder, 'public'
источник
http://sinatrarb.com/configuration.html#static---enabledisable-static-file-routes
Это был бы правильный способ сделать это.
set :public_folder, 'public'
Я использовал статический параметр, потому что он может повлиять на использование public_folder.
источник
Синатра-assetpack камень предлагает целую кучу возможностей. синтаксис приятный:
serve '/js', from: '/app/javascripts'
Хотя у меня все еще есть проблемы с конвейером ресурсов rails, я чувствую, что с помощью sinatra-assetpack у меня гораздо больше контроля, но в большинстве случаев он работает с несколькими строками кода.
источник
ОБНОВЛЕННЫЙ ОТВЕТ : Я связал все вышеперечисленное, но мне не удалось загрузить css, js .... и т. Д., Единственное, что загружалось, это index.html ... а все остальное было = >>
404 error
Мое решение: папка приложения выглядит так.
index.rb
== >> Код Синатры идет.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, бла-бла .. и т.д.user@user-SVE1411EGXB:~/sintra1$ ls index.rb public user@user-SVE1411EGXB:~/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 user@user-SVE1411EGXB:~/sintra1$
Теперь запустите сервер, и вы сможете без проблем перемещаться по статическим страницам.
user@user-SVE1411EGXB:~/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
источник
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
источник
Вы всегда можете использовать Rack :: Static
https://www.rubydoc.info/gems/rack/Rack/Static
Просто добавьте эту строку перед командой run в config.ru
use Rack::Static, :urls => [""], :root => 'public', :index => 'index.html'
источник
Вы можете подумать о перемещении
index.html
файлаviews/index.erb
и определении конечной точки, например:get '/' do erb :index end
источник
Размещение файлов в
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
источник
Что насчет этого решения? :
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
источник