ruby - sinatra php
Sirviendo archivos estáticos con Sinatra (13)
¿Qué hay de 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) / subdirectory / test / cargará subdirectory / test / index.html
Tengo un sitio web de una sola página que solo 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
Agregue la línea siguiente en el archivo principal rb
set :public_folder, ''public''
Poner archivos en public
carpeta public
tiene una limitación. En realidad, cuando estás en la raíz ''/''
ruta 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
, 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
Puede considerar mover el archivo index.html
a views/index.erb
y definir un punto final como:
get ''/'' do
erb :index
end
Puede usar el helper send_file
para servir archivos.
require ''sinatra''
get ''/'' do
send_file File.join(settings.public_folder, ''index.html'')
end
Esto servirá a index.html
desde cualquier directorio que se haya configurado con los archivos estáticos de su aplicación.
Simplemente puede alojarlos desde la carpeta pública y no necesitan rutas.
.
-- myapp.rb
`-- public
|-- application.css
|-- application.js
|-- index.html
`-- jquery.js
En el 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 en ./public es accesible desde ''/whatever/bla.html
Ejemplo:
./public/stylesheets/screen.css
Se podrá acceder a través de ''/stylesheets/screen.css'' no se requiere ruta
Sin ninguna configuración adicional, Sinatra servirá activos en public
. Para la ruta vacía, querrá renderizar el documento índice.
require ''rubygems''
require ''sinatra''
get ''/'' do
File.read(File.join(''public'', ''index.html''))
end
Las rutas deben devolver una String
que se convierta en el cuerpo de respuesta HTTP. File.read
abre un archivo, lee el archivo, cierra el archivo y devuelve un String
.
Sinatra debería permitirle servir archivos estáticos del directorio público como se explica en los documentos :
Archivos estáticos
Los archivos estáticos se sirven desde el directorio ./public. 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. Un archivo ./public/css/style.css está disponible como example.com/css/style.css.
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 tiene que pasar por la pila Sinatra / Rack solo para servir texto estático, que es lo que Apache / Nginx son geniales al hacer.
la gema sinatra-assetpack ofrece un montón de características. la sintaxis es dulce:
serve ''/js'', from: ''/app/javascripts''
Mientras sigo teniendo problemas con la cartera de activos de carriles, siento que tengo mucho más control con sinatra-assetpack , pero la mayoría de las veces solo funciona con unas pocas líneas de código.
http://sinatrarb.com/configuration.html#static---enabledisable-static-file-routes
Esta sería la forma correcta de hacerlo.
set :public_folder, ''public''
Utilicé la configuración estática porque su configuración puede afectar el uso de la carpeta pública.
RESPUESTA ACTUALIZADA : Ataron todo lo anterior sin tener la suerte de poder cargar css, js ... etc contenidos, lo único que se estaba cargando es index.html ... y el resto fue 404 error
= >> 404 error
Mi solución: la carpeta de la aplicación se ve así.
index.rb
== >> El código de 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, 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$
Ahora inicie el servidor y podrá navegar a través de páginas estáticas sin problemas.
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