4

Sinatraルビーフレームワークでは、次のようなルートがあります。

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

これは、存在するテンプレートの場合(たとえば、を押し/portfolio/websiteて、というテンプレート/views/website.hamlがある場合)はうまく機能しますが、のようにテンプレートのないURLを試してみると、次のexample.com/portfolio/notemplateエラーが発生します。

/ portal/notemplateのErrno::ENOENT
そのようなファイルまたはディレクトリはありません-/.../views/notemplate.haml

テンプレートが存在するかどうかをテストしてキャッチするにはどうすればよいですか?Sinatraのドキュメントに「テンプレートが存在する場合」のメソッドが見つかりません。

4

2 に答える 2

5

Sinatra 固有の方法があるかどうかはわかりませんが、次のようにいつでも Errno::ENOENT 例外をキャッチできます。

get '/portfolio/:item' do
  begin
    haml params[:item].to_sym
  rescue Errno::ENOENT
    haml :default
  end 
end
于 2009-10-21T16:18:11.817 に答える
5

ファイルが存在しない場合でもシンボルが作成されるため、最初の答えは適切ではありません。また、シンボルはガベージ コレクションされないため、簡単にメモリ リークが発生します。常にシンボルを作成する、存在しないファイルに対する DDOS 攻撃を考えてみてください。代わりに、ここでこのルートを使用します (css ファイルをルーティングする私のプロジェクトの 1 つから取得):

# 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
于 2011-12-17T19:11:29.300 に答える