エラー画面の処理 - Sinatra

404ページのエラー表示をするには

404のエラーの時、独自のエラーページを表示するには以下のようにします。

viewsの中に「 error 」ディレクトリを作成し、「 404.erb 」のエラーページを作成します。

not_found do
  status 404
  erb :'errors/404'
end

また、「 not_found 」ではなくステータスコードの404を指定することもできます。

error 404 do
  status 404
  erb :'errors/404'
end

SinatraでRack::Csrfの例外をハンドリングする

CSRF対策のRack::Csrfは「 use Rack::Csrf, :raise => true 」と記述しただけでは、errorハンドラで例外を補足できません。

production環境ではCSRFチェックに引っかかるとステータスコードが403になり、真っ白な画面が表示されます。

そのため、以下のようなコードを追加します。

use Rack::Csrf, :raise => true, :skip => ['POST:.*', 'PUT:.*', 'DELETE:.*']
# Sinatraの例外表示処理を無効
set :show_exceptions, false

def check_csrf
   raise Rack::Csrf::InvalidCsrfToken unless params[Rack::Csrf.csrf_field] == session['csrf.token']
end

before do
   check_csrf if ['POST', 'PUT', 'DELETE'].include?(env['REQUEST_METHOD'])
end

error Rack::Csrf::InvalidCsrfToken do
   erb :"errors/500"
end

特定のページだけCSRFチェックしたい場合は、beforeブロック内のcheck_csrfを削除し、各ルーティングのメソッドに check_csrfメソッドを設定します。

post '/foo' do
  check_csrf
end