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.

Était-ce utile?

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
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top