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 つの点が改善されます。
- Rails の組み込みのrescue_fromハンドラーを使用して404ページをレンダリングします。
- コードの実行を中断し、次のような便利なことができるようになります。
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 から詳細情報を参照してください。