Tengo un sitio web de una sola página que usa HTML, CSS y JavaScript. Quiero implementar la aplicación en Heroku, pero no puedo encontrar la 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 el 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
require 'webrick'; server = WEBrick::HTTPServer.new Port: 1234; server.mount '/', WEBrick::HTTPServlet::FileHandler, 'www/'; trap("INT") { server.stop }; server.start;
Entonces correruby myapp.rb
. Retire el puerto para Heroku. Ponerweb: ruby myapp.rb
en tuProcfile
. El comentario no responde, ya que no es para Sinatra, pero creo que simplifica las dependencias.Respuestas:
Sin ninguna configuración adicional, Sinatra servirá activos en
public
. Para la ruta vacía, querrás representar el documento de índice.Las rutas deben devolver un
String
que se convierta en el cuerpo de respuesta HTTP.File.read
abre un archivo, lee el archivo, cierra el archivo y devuelve aString
.fuente
send_file File.expand_path('index.html', settings.public)
.settings.public
consettings.public_folder
para obtenersend_file File.expand_path('index.html', settings.public_folder)
send_file
, hace cosas adicionales para ti github.com/sinatra/sinatra/blob/master/lib/sinatra/base.rb#L351File.read
lee todo el archivo en la memoria. Esto puede estar bien o no, dependiendo del tamaño de los archivos y el número de solicitudes concurrentes.Puede usar el
send_file
ayudante para servir archivos.Esto servirá
index.html
desde cualquier directorio que haya sido configurado como teniendo los archivos estáticos de su aplicación.fuente
set :public_folder
, por lo que usarías ensettings.public_folder
lugar desettings.public
Podrías alojarlos desde la carpeta pública y no necesitan rutas.
En el myapp.rb
Enlace a alguna subcarpeta en público
Se puede acceder a todo en ./public desde '/whatever/bla.html
Ejemplo:
./public/stylesheets/screen.css
Se podrá acceder a través de '/stylesheets/screen.css' sin necesidad de ruta
fuente
set :public_folder, 'public'
. Eso fue clave para que funcione, a pesar de la documentación de Sinatra que implica que esto ya estaba configurado como predeterminado.Tenga en cuenta que en producción puede hacer que su servidor web se envíe
index.html
automáticamente para que la solicitud nunca llegue a Sinatra. Esto es mejor para el rendimiento, ya que no tiene que pasar por la pila de Sinatra / Rack solo para servir texto estático, que es lo que Apache / Nginx es increíble para hacer.fuente
Sinatra debería permitirle servir archivos estáticos desde el directorio público como se explica en los documentos :
fuente
Agregue la siguiente línea en el archivo rb principal
fuente
la gema sinatra-assetpack ofrece un montón de características. la sintaxis es dulce:
Si bien sigo teniendo problemas con la canalización de activos de rails, 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.
fuente
RESPUESTA ACTUALIZADA : empaté todo lo anterior sin suerte de poder cargar css, js .... etc. contenido, lo único que se estaba cargando es index.html ... y el resto iban = >>
404 error
Mi solución: la carpeta de la aplicación se ve así.
index.rb
== >> El código de Sinatra va.public folder
== >> contiene todo lo demás ... css, js, bla, bla, etc.Ahora inicie el servidor y podrá navegar a través de páginas estáticas sin problemas.
fuente
fuente
http://sinatrarb.com/configuration.html#static---enabledisable-static-file-routes
Esta sería la forma correcta de hacerlo.
Utilicé la configuración estática porque su configuración puede afectar el uso de public_folder.
fuente
Puede considerar mover el
index.html
archivoviews/index.erb
y definir un punto final como:fuente
Siempre puedes usar Rack :: Static
https://www.rubydoc.info/gems/rack/Rack/Static
Simplemente agregue esta línea antes del comando 'ejecutar' en 'config.ru'
fuente
Poner archivos en la
public
carpeta tiene una limitación. En realidad, cuando está en la'/'
ruta raíz funciona correctamente porque el navegador establecerá la ruta relativa de su archivo css, por ejemplo,/css/style.css
y sinatra buscará el archivo en elpublic
directorio. Sin embargo, si su ubicación es, por ejemplo/user/create
, el navegador web buscará su archivo CSS/user/create/css/style.css
y fallará.Como solución alternativa, agregué la siguiente redirección para cargar correctamente el archivo CSS:
fuente
¿Qué hay de esta solución? :
así que si ahora navega a (por ejemplo) / subdirectory / test / se cargará subdirectory / test / index.html
fuente