2010-04-04 6 views
12

Vous pouvez servir des fichiers statiques avec Sinatra en les plaçant dans public/ (par défaut) - J'ai un index.html là pour le moment, mais comment puis-je faire le point de la racine de ce fichier sans avoir à l'analyser comme un modèle?Routage de page statique dans Sinatra (Ruby)

Pour être clair, je peux accéder /index.html avec succès, et je voudrais router / pour être le même fichier statique, mais sans rediriger. Une idée de comment faire cela?

Répondre

18

Probablement une meilleure réponse viendra éventuellement, jusqu'à ce que ce soit mon coup de feu.

Si ce n'est pas ce que vous voulez:

get '/' do 
    redirect '/index.html' 
end 

Vous pourriez faire quelque chose comme ceci:

get '/' do 
    File.new('public/index.html').readlines 
end 

je partirais avec le premier si, Je ne sais pas pourquoi vous voulez éviter cette redirection

+0

vote pour la première solution. aussi si vous utilisez le passager, cela fonctionne simplement. aucun routage requis ou redirection. – rubiii

+1

@rubii Je pense qu'il vaudrait la peine de mettre le passager dans sa propre réponse. Cela semble être une réponse plus correcte que la mienne –

+0

Je pense que votre réponse est parfaitement bien. Je parie que JP n'utilise pas de passager. mais je posterai une réponse pour tout le monde. – rubiii

3

en utilisant passenger cela semble fonctionner dès la sortie de la boîte. avoir un fichier index.html dans le répertoire public et aucun routage n'indique l'index.html lors de l'accès à l'URL racine.

6

Réglez simplement enable :static dans la classe de votre application. Comme si:

class App < Sinatra::Base 
    # Set the app root; this is where the 'public' and 'views' 
    # directories are found (by default). 
    set :root, File.expand_path("#{File.dirname(__FILE__)}/../app") 

    # Allow the app to serve static files from the 'public' directory in :root 
    enable :static 
end 
3

Je pense que ce n'est un problème parce que Sinatra/Rack n'a pas le concept d'un fichier par défaut pour servir si vous allez juste /. Dans un serveur web comme Apache ou Nginx ceci est pris en charge par vous et index.html index.htm par défaut (si l'un existe, il sera servi lorsque vous allez dans un répertoire sans nom de fichier à la fin).

Quand tout le monde dit que cela est intégré dans Passenger, je pense qu'ils veulent vraiment dire qu'il est intégré à Apache/Nginx. Apache/Nginx va vérifier si le fichier statique existe et le servir si c'est le cas, la requête ne sera jamais accessible à Rack, ce qui est génial pour les performances. Je ne voudrais pas mettre en place une redirection vers la page 404 car cela enfreint l'idée de HTTP: il devrait y avoir un point de terminaison pour tout ce point final devrait renvoyer l'état vrai de ce point de terminaison. Ce qui signifie que si vous allez à /asdf vous voulez le serveur web pour signaler un 404 parce que c'est ce qui se passe réellement. Si vous faites une redirection, maintenant votre site dit: «J'avais quelque chose ici, mais il a déménagé» et la page vers laquelle il vous redirige, même si elle indique 404 dans le texte sur la page, est en fait signalée par le web serveur en 200, ce qui signifie "tout va bien avec cette page!"