Comment vérifier si un modèle existe dans Sinatra
Question
Dans le cadre Sinatra Ruby, j'ai un itinéraire comme celui-ci:
get '/portfolio/:item' do
haml params[:item].to_sym
end
Cela fonctionne très bien si le modèle existant (par exemple, si je clique sur / portfolio / site Web
et que j'ai un modèle appelé /views/website.haml
), mais si j'essaye une URL qui n'a pas de modèle, comme exemple.com/portfolio/notemplate
, j'obtiens cette erreur:
Errno :: ENOENT at / portfolio / notemplate
Aucun fichier ou répertoire de ce type - /.../ views / notemplate.haml
Comment puis-je tester et savoir si le modèle existe? Je ne parviens pas à trouver un "si le modèle existe". méthode dans la documentation de Sinatra.
La solution
Vous ne savez pas s'il existe un moyen spécifique à Sinatra de le faire, mais vous pouvez toujours intercepter l'exception Errno :: ENOENT, comme suit:
get '/portfolio/:item' do
begin
haml params[:item].to_sym
rescue Errno::ENOENT
haml :default
end
end
Autres conseils
La première réponse n’est pas bonne, car si un fichier n’existe pas, un symbole est quand même créé. Et puisque les symboles ne sont pas ramassés, vous perdez facilement de la mémoire. Il suffit de penser à une attaque par DDOS contre des fichiers non existants qui créent des symboles tout le temps. Utilisez plutôt cette route ici (tirée de l’un de mes projets routant les fichiers css):
# sass style sheet generation
get '/css/:file.css' do
halt 404 unless File.exist?("views/#{params[:file]}.scss")
time = File.stat("views/#{params[:file]}.scss").ctime
last_modified(time)
scss params[:file].intern
end