Reputation: 28193
I have one page website only using HTML, CSS and JavaScript. I want to deploy the app to Heroku, but I cannot find a way to do it. I am now trying to make the app working with Sinatra.
.
|-- application.css
|-- application.js
|-- index.html
|-- jquery.js
`-- myapp.rb
And the following is the content of myapp.rb
.
require 'rubygems'
require 'sinatra'
get "/" do
# What should I write here to point to the `index.html`
end
Upvotes: 144
Views: 92275
Reputation: 455
Add below line in main rb file
set :public_folder, 'public'
ref: http://sinatrarb.com/configuration.html#static---enabledisable-static-file-routes
Upvotes: 6
Reputation: 133
You can always use Rack::Static
https://www.rubydoc.info/gems/rack/Rack/Static
Just add this line before 'run' command into 'config.ru'
use Rack::Static, :urls => [""], :root => 'public', :index => 'index.html'
Upvotes: 3
Reputation: 2112
http://sinatrarb.com/configuration.html#static---enabledisable-static-file-routes
This would be the correct way of doing it.
set :public_folder, 'public'
I used the static setting because it's setting can affect the public_folder usage.
Upvotes: 3
Reputation: 1244
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
Upvotes: 2
Reputation: 7709
UPDATED ANSWER:
I tied all the above with no luck of being ablle to load css, js....etc contents the only thing that was loading is index.html... and the rest were going =>> 404 error
My solution: app folder looks like this .
index.rb
==>> Sinatra code goes .
require 'rubygems'
require 'sinatra'
get '/' do
html :index
end
def html(view)
File.read(File.join('public', "#{view.to_s}.html"))
end
public folder
==>> contains everything else ...css , js , blah blah..etc.
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$
Now start server and you will be able to navigate through static pages with no problem.
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
Upvotes: 2
Reputation: 610
Putting files in public
folder has a limitation. Actually, when you are in the root '/'
path is works correctly because the browser will set the relative path of your css file for example /css/style.css
and sinatra will look for the file in the public
directory. However, if your location is for example /user/create
, then the web browser will look for your css file in /user/create/css/style.css
and will the fail.
As a workaround, I added the following redirection to correctly load css file:
get %r{.*/css/style.css} do
redirect('css/style.css')
end
Upvotes: 0
Reputation: 2956
You might consider moving the index.html
file to views/index.erb
, and defining an endpoint like:
get '/' do
erb :index
end
Upvotes: 1
Reputation: 468
Sinatra should let you serve static files from the public directory as explained in the docs:
Static Files
Static files are served from the ./public directory. You can specify a different location by setting the :public option:
Note that the public directory name is not included in the URL. A file ./public/css/style.css is made available as example.com/css/style.css.
Upvotes: 11
Reputation: 444
the sinatra-assetpack gem offers a whole bunch of features. syntax is sweet:
serve '/js', from: '/app/javascripts'
while i am still having issues with rails assets pipeline i feel like i have much more control using sinatra-assetpack - but most of the times it just works with a few lines of code.
Upvotes: 2
Reputation: 20554
You could just host them from the public folder and they do not need routes.
.
-- myapp.rb
`-- public
|-- application.css
|-- application.js
|-- index.html
`-- jquery.js
In the myapp.rb
set :public_folder, 'public'
get "/" do
redirect '/index.html'
end
Link to some sub folder in public
set :public_folder, 'public'
get "/" do
redirect '/subfolder/index.html'
end
Everything in ./public is accessible from '/whatever/bla.html
Example :
./public/stylesheets/screen.css
Will be accessible via '/stylesheets/screen.css' no route required
Upvotes: 66
Reputation: 7934
You can use the send_file
helper to serve files.
require 'sinatra'
get '/' do
send_file File.join(settings.public_folder, 'index.html')
end
This will serve index.html
from whatever directory has been configured as having your application's static files.
Upvotes: 172
Reputation: 9786
Keep in mind that in production you can have your web server send out index.html
automatically so that the request never gets to Sinatra. This is better for performance as you don't have to go through the Sinatra/Rack stack just to serve static text, which is what Apache/Nginx are awesome at doing.
Upvotes: 12
Reputation: 840
What about this solution? :
get "/subdirectory/:file" do
file = params[:file] + "index.html"
if File.exists?(params[:file])
return File.open("subdirectory/" + file)
else
return "error"
end
end
so if you now navigate to (for example) /subdirectory/test/ it will load subdirectory/test/index.html
Upvotes: -6
Reputation: 3950
Without any additional configuration, Sinatra will serve assets in public
. For the empty route, you'll want to render the index document.
require 'rubygems'
require 'sinatra'
get '/' do
File.read(File.join('public', 'index.html'))
end
Routes should return a String
which become the HTTP response body. File.read
opens a file, reads the file, closes the file and returns a String
.
Upvotes: 135