Вопрос

В фреймворке 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
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top