2009-10-21 3 views
4

В рамках Синатра рубина, у меня есть маршрут, как это:Как проверить, если шаблон существует в Синатры

get '/portfolio/:item' do 
    haml params[:item].to_sym 
end 

Это прекрасно работает, если шаблон, который существует (например, если я ударил /portfolio/website, и я есть шаблон под названием /views/website.haml), но если я пытаюсь URL, который не имеет шаблона, как example.com/portfolio/notemplate, я получаю эту ошибку:

Errno::ENOENT at /portfolio/notemplate
No such file or directory - /.../views/notemplate.haml

Как я могу проверить и поймать, существует ли шаблон? Я не могу найти метод «если шаблон существует» в документации Sinatra.

+0

См http://www.sinatrarb.com/intro#Looking%20Up%20Template%20Files – Andrei

ответ

5

Не уверен, что если есть Синатра специфический способ сделать это, но вы всегда можете поймать исключение Errno :: ENOENT, например, так:

get '/portfolio/:item' do 
    begin 
    haml params[:item].to_sym 
    rescue Errno::ENOENT 
    haml :default 
    end 
end 
+0

В теории, это то, что я m пытается сделать, но это дает мне ошибку app.rb: 47: синтаксическая ошибка, неожиданный tSYMBEG, ожидающий kDO или '{' или '(' rescue Errno: ENOENT^Но мне удалось заставить его работать с параметрами haml [ : item] .to_sym rescue pass Спасибо за идею. –

+0

Вам нужно «:». спасти Errno :: ENOENT' –

+0

И спасательный проход не позволяет отображать другую страницу. Он просто игнорирует вещь (и игнорирует ошибки никогда не являются хорошей идеей). –

5

Первый ответ не является хорошим, потому что если файл не существует, так или иначе создается символ. А поскольку символы не собираются с мусором, вы легко теряете память. Просто подумайте об атаке ddos ​​против файлов nonexisitng, которые создают символы все время. Вместо того, чтобы использовать этот маршрут здесь (взято из одного из моих проектов маршрутизации 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 
Смежные вопросы