2009-10-21 52 views
4

存在一个模板在西纳特拉Ruby框架,我有这样的路线:如何检查是否在西纳特拉

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

这个伟大的工程,如果存在的模板(例如,如果我打/portfolio/website,和我有一个叫/views/website.haml)模板,但如果我尝试在没有模板,像example.com/portfolio/notemplate一个网址,我得到这个错误:

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

我如何测试和捕捉模板是否存在?我无法在Sinatra文档中找到“if template exists”方法。

+0

见http://www.sinatrarb.com/intro#Looking%20Up%20Template%20Files – Andrei 2011-09-10 10:00:09

回答

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或'{'或'('救援Errno:ENOENT ^但我能得到它与haml params [ :item] .to_sym rescue pass感谢您的想法 – 2009-10-22 12:22:23

+0

您需要“:”。“救援Errno :: ENOENT” – 2009-10-22 12:29:48

+0

救援通行证不允许您显示其他页面,它只是忽略了事情(并忽略错误从来不是一个好主意) – 2009-10-22 12:30:25

5

第一个答案是不是一个很好的,因为如果一个文件不存在一个符号创建无论如何。由于符号不是垃圾收集,你很容易泄漏内存。只要想一想ddos攻击nonxisitng文件,它始终创建符号。相反,在这里使用这条路线(从我的项目路由的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