Techioz Blog

Rails で 404 にリダイレクトするにはどうすればよいですか?

概要

Rails で 404 ページを「偽装」したいと考えています。 PHP では、次のようなエラー コードを含むヘッダーを送信します。

header("HTTP/1.0 404 Not Found");

それはRailsではどのように行われるのでしょうか?

解決策

404 を自分でレンダリングしないでください。そうする理由はありません。 Rails にはこの機能がすでに組み込まれています。 404 ページを表示したい場合は、次のように ApplicationController で render_404 メソッド (または not_found と呼んでいました) を作成します。

def not_found
  raise ActionController::RoutingError.new('Not Found')
end

Rails は、AbstractController::ActionNotFound と ActiveRecord::RecordNotFound も同様に処理します。

これにより、次の 2 つの点が改善されます。

  1. Rails の組み込みのrescue_fromハンドラーを使用して404ページをレンダリングします。
  2. コードの実行を中断し、次のような便利なことができるようになります。
  user = User.find_by_email(params[:email]) or not_found
  user.do_something!

醜い条件文を書く必要はありません。

おまけに、テストでの扱いも非常に簡単です。たとえば、rspec 統合テストでは次のようになります。

# RSpec 1

lambda {
  visit '/something/you/want/to/404'
}.should raise_error(ActionController::RoutingError)

# RSpec 2+

expect {
  get '/something/you/want/to/404'
}.to raise_error(ActionController::RoutingError)

そしてミニテスト:

assert_raises(ActionController::RoutingError) do 
  get '/something/you/want/to/404'
end

または、Rails render 404 not found from acontroller action から詳細情報を参照してください。