Как проверить, существует ли шаблон в Sinatra
Вопрос
В фреймворке Sinatra ruby у меня есть такой маршрут:
get '/portfolio/:item' do
haml params[:item].to_sym
end
Это отлично работает, если шаблон, который существует (например, если я нажму /portfolio/website
, и у меня есть шаблон под названием /views/website.haml
), но если я попробую использовать URL-адрес, у которого нет шаблона, например example.com/portfolio/notemplate
, я получаю эту ошибку:
Errno::ДОСТАТОЧНО в /portfolio/notemplate
Нет такого файла или каталога - /.../views/notemplate.haml
Как я могу проверить и определить, существует ли шаблон?Я не могу найти метод "если шаблон существует" в документации Sinatra.
Решение
Не уверен, что есть конкретный способ Sinatra сделать это, но вы всегда можете перехватить исключение Errno::ENOENT, вот так:
get '/portfolio/:item' do
begin
haml params[:item].to_sym
rescue Errno::ENOENT
haml :default
end
end
Другие советы
Первый ответ не является хорошим, потому что, если файл не существует, символ все равно создается.А поскольку символы не собираются как мусор, вы легко допускаете утечку памяти.Просто подумайте о ddos-атаке на несуществующие файлы, которые постоянно создают символы.Вместо этого используйте этот маршрут здесь (взят из одного из моих проектов маршрутизации 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