Eu tenho um site de página única usando HTML, CSS e JavaScript. Quero implantar o aplicativo no Heroku, mas não consigo encontrar uma maneira de fazê-lo. Agora estou tentando fazer o aplicativo funcionar com Sinatra.
.
|-- application.css
|-- application.js
|-- index.html
|-- jquery.js
`-- myapp.rb
E o seguinte é o conteúdo 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;
Então corraruby myapp.rb
. Remova a porta para o Heroku. Coloqueweb: ruby myapp.rb
no seuProcfile
. O comentário não responde, pois não é para o Sinatra, mas acho que simplifica as dependências.Respostas:
Sem nenhuma configuração adicional, o Sinatra servirá ativos
public
. Para a rota vazia, você deseja renderizar o documento de índice.As rotas devem retornar um
String
que se torne o corpo da resposta HTTP.File.read
abre um arquivo, lê o arquivo, fecha o arquivo e retorna aString
.fonte
send_file File.expand_path('index.html', settings.public)
.settings.public
porsettings.public_folder
para obtersend_file File.expand_path('index.html', settings.public_folder)
send_file
, ele faz coisas extras para você github.com/sinatra/sinatra/blob/master/lib/sinatra/base.rb#L351File.read
lê o arquivo inteiro na memória. Isso pode ser bom ou não, dependendo do tamanho dos arquivos e do número de solicitações simultâneas.Você pode usar o
send_file
auxiliar para servir arquivos.Isso servirá a
index.html
partir de qualquer diretório que tenha sido configurado como tendo os arquivos estáticos do seu aplicativo.fonte
set :public_folder
, então você usaria emsettings.public_folder
vez desettings.public
Você pode simplesmente hospedá-los da pasta pública e eles não precisam de rotas.
No myapp.rb
Link para alguma subpasta em público
Tudo em ./public está acessível em '/whatever/bla.html
Exemplo:
./public/stylesheets/screen.css
estará acessível através de '/stylesheets/screen.css', nenhuma rota necessária
fonte
set :public_folder, 'public'
. Isso foi fundamental para fazê-lo funcionar, apesar da documentação do Sinatra implicar que isso já estava definido como padrão.Lembre-se de que, na produção, o servidor da Web pode ser enviado
index.html
automaticamente, para que a solicitação nunca chegue a Sinatra. Isso é melhor para o desempenho, pois você não precisa passar pela pilha do Sinatra / Rack apenas para veicular texto estático, que é o que o Apache / Nginx é incrível em fazer.fonte
O Sinatra deve permitir a veiculação de arquivos estáticos do diretório público, conforme explicado nos documentos :
fonte
Adicione abaixo da linha no arquivo rb principal
fonte
o gem sinatra-assetpack oferece um monte de recursos. sintaxe é doce:
Enquanto ainda estou tendo problemas com o pipeline de ativos de trilhos, sinto que tenho muito mais controle usando o sinatra-assetpack - mas na maioria das vezes ele funciona apenas com algumas linhas de código.
fonte
RESPOSTA ATUALIZADA : Eu amarrei tudo o que precede, sem a possibilidade de carregar o conteúdo de css, js .... etc. etc, a única coisa que estava carregando é index.html ... e o resto estava acontecendo = >>
404 error
Minha solução: pasta do aplicativo é assim.
index.rb
== >> O código Sinatra continua.public folder
== >> contém todo o resto ... css, js, blah blah..etc.Agora inicie o servidor e você poderá navegar pelas páginas estáticas sem nenhum problema.
fonte
fonte
http://sinatrarb.com/configuration.html#static---enabledisable-static-file-routes
Essa seria a maneira correta de fazê-lo.
Eu usei a configuração estática porque ela pode afetar o uso da pasta pública.
fonte
Você pode considerar mover o
index.html
arquivo paraviews/index.erb
e definir um terminal como:fonte
Você sempre pode usar o Rack :: Static
https://www.rubydoc.info/gems/rack/Rack/Static
Basta adicionar esta linha antes do comando 'run' em 'config.ru'
fonte
Colocar arquivos na
public
pasta tem uma limitação. Na verdade, quando você está no'/'
caminho raiz, funciona corretamente porque o navegador definirá o caminho relativo do seu arquivo css, por exemplo,/css/style.css
e o sinatra procurará o arquivo nopublic
diretório No entanto, se sua localização for, por exemplo/user/create
, o navegador da Web procurará seu arquivo css/user/create/css/style.css
e falhará.Como solução alternativa, adicionei o seguinte redirecionamento para carregar corretamente o arquivo css:
fonte
E essa solução? :
portanto, se você agora navegar para (por exemplo) / subdiretório / teste / ele carregará o subdiretório / test / index.html
fonte