Servir archivos estáticos con Sinatra
Tengo una página web solo usando HTML, CSS y JavaScript. Quiero implementar la aplicación en Heroku, pero no puedo encontrar una manera de hacerlo. Ahora estoy tratando de hacer que la aplicación funcione con Sinatra.
.
|-- application.css
|-- application.js
|-- index.html
|-- jquery.js
`-- myapp.rb
Y lo siguiente es el contenido de myapp.rb
.
require 'rubygems'
require 'sinatra'
get "/" do
# What should I write here to point to the `index.html`
end
14 answers
Sin ninguna configuración adicional, Sinatra servirá activos en public
. Para la ruta vacía, querrá representar el documento de índice.
require 'rubygems'
require 'sinatra'
get '/' do
File.read(File.join('public', 'index.html'))
end
Las rutas deben devolver un String
que se convierte en el cuerpo de respuesta HTTP. File.read
abre un archivo, lo lee, lo cierra y devuelve un String
.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-03-13 13:34:20
Puede usar el ayudante send_file
para servir archivos.
require 'sinatra'
get '/' do
send_file File.join(settings.public_folder, 'index.html')
end
Esto servirá index.html
desde cualquier directorio que haya sido configurado como teniendo los archivos estáticos de su aplicación.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-02-20 05:39:33
Simplemente podría alojarlos desde la carpeta pública y no necesitan rutas.
.
-- myapp.rb
`-- public
|-- application.css
|-- application.js
|-- index.html
`-- jquery.js
En la myapp.rb
set :public_folder, 'public'
get "/" do
redirect '/index.html'
end
Enlace a alguna subcarpeta en público
set :public_folder, 'public'
get "/" do
redirect '/subfolder/index.html'
end
Todo dentro ./ public es accesible desde ' / whatever / bla.html
Ejemplo:
./ public / stylesheets / screen.css
Será accesible a través de ' /stylesheets / screen.css' no se requiere ruta
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-04-28 16:10:28
Tenga en cuenta que en producción puede hacer que su servidor web envíe index.html
automáticamente para que la solicitud nunca llegue a Sinatra. Esto es mejor para el rendimiento, ya que no tienes que ir a través de la pila Sinatra/Rack solo para servir texto estático, que es lo que Apache/Nginx son impresionantes en hacer.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-02-11 17:52:37
Sinatra debería permitirle servir archivos estáticos desde el directorio público como se explica en los documentos :
Archivos estáticos
Los archivos estáticos se sirven desde el ./directorio público. Puede especificar una ubicación diferente configurando la opción: public:
Tenga en cuenta que el nombre del directorio público no está incluido en la URL. Archivo ./ public / css / style.css está disponible como example.com/css/style.css.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-08-09 16:02:05
La gema sinatra-assetpack ofrece un montón de características. la sintaxis es dulce:
serve '/js', from: '/app/javascripts'
Mientras todavía tengo problemas con rails assets pipeline siento que tengo mucho más control usando sinatra-assetpack - pero la mayoría de las veces solo funciona con unas pocas líneas de código.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-06-29 16:29:13
RESPUESTA ACTUALIZADA :
Até todo lo anterior sin suerte de ser capaz de cargar css, js....etc contents lo único que estaba cargando es index.HTML... y el resto iba =>> 404 error
Mi solución: la carpeta de la aplicación se ve así .
index.rb
==>> Código Sinatra va .
require 'rubygems'
require 'sinatra'
get '/' do
html :index
end
def html(view)
File.read(File.join('public', "#{view.to_s}.html"))
end
public folder
==>> contiene todo lo demás ...css , js , bla, bla..sucesivamente.
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$
Ahora inicie el servidor y podrá navegar a través de páginas estáticas sin problema.
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
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-01-27 22:10:44
Agregue la línea inferior en el archivo rb principal
set :public_folder, 'public'
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-05-07 15:18:44
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
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-07-29 08:42:25
Podría considerar mover el archivo index.html
a views/index.erb
y definir un punto final como:
get '/' do
erb :index
end
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-10-24 13:30:02
Poner archivos en la carpeta public
tiene una limitación. En realidad, cuando estás en la ruta raíz '/'
funciona correctamente porque el navegador establecerá la ruta relativa de tu archivo css por ejemplo /css/style.css
y sinatra buscará el archivo en el directorio public
. Sin embargo, si su ubicación es por ejemplo /user/create
, entonces el navegador web buscará su archivo css en /user/create/css/style.css
y fallará.
Como solución alternativa, agregué la siguiente redirección para cargar correctamente el archivo css:
get %r{.*/css/style.css} do
redirect('css/style.css')
end
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-01-19 06:39:26
Http://sinatrarb.com/configuration.html#static---enabledisable-static-file-routes
Esta sería la forma correcta de hacerlo.
set :public_folder, 'public'
Usé la configuración estática porque su configuración puede afectar el uso de public_folder.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-01-26 21:55:05
Siempre puedes usar Rack:: Static
Https://www.rubydoc.info/gems/rack/Rack/Static
Simplemente agregue esta línea antes de la orden' run ' en 'config.ru"
use Rack::Static, :urls => [""], :root => 'public', :index => 'index.html'
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-09-26 06:52:46
¿Qué pasa con esta solución? :
get "/subdirectory/:file" do
file = params[:file] + "index.html"
if File.exists?(params[:file])
return File.open("subdirectory/" + file)
else
return "error"
end
end
Así que si ahora navega a (por ejemplo) /subdirectorio/test/ cargará el subdirectorio/test/index.html
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-04-12 11:57:31