今日はRailsで動的な404ページを作成する方法をまとめていきます(個人メモの側面強め)。Railsで公開アプリを作っている場合は404ページをいい感じに設計してユーザーに次のアクションにつなげてもらうことが必要になります。404発生時に他のページにリダイレクトして200で返すとソフト404といってGoogleの検索エンジンからマイナス評価を受けるのでSEOが重要なサイトは絶対にNG。
Railsにはデフォルトで404ページがpublicディレクトリの中にあるのですがこれは静的なファイルでviewsディレクトリのlayoutを使用することができません。今日はviewsのlayoutを使用していい感じな404ページを実装していきたいと思います。
開発環境の準備をしよう
まずは開発環境下でも本番用の404ページが表示されるようにしていきましょう。そのままだと404が起こった時にデバッグ用のroutesページが開いてしまいます。
config > development.rbの変更点
1 2 3 |
config.consider_all_requests_local = false |
デフォルトはtrueとなっていますが、ここをfalseにします。これで本番環境と同様の404ページを確認できるようになります。レポジトリにpushする前に絶対に元に戻すようにしてくださいね。
動的な404ページを実装
それでは、404ページ用のrouteの設定をしていきましょう。
config > routes.rbへの記載内容
1 2 3 4 5 6 7 |
Rails.application.routes.draw do # 例外 get '*not_found', to: 'application#routing_error' post '*not_found', to: 'application#routing_error' end |
「#例外」以下のコードをroutes.rb内の一番下にコピペしてください。
次にApplicationControllerに例外が発生したときの処理を書いていきましょう。
controllers > application_controller.rbへの記載内容
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
unless Rails.env.development? rescue_from Exception, with: :render_500 rescue_from ActiveRecord::RecordNotFound, with: :render_404 rescue_from ActionController::RoutingError, with: :render_404 end def routing_error raise ActionController::RoutingError, params[:path] end private def render_404 render 'error/404', status: :not_found end def render_500 render 'error/500', status: :internal_server_error end |
上記のコードを追加していってください。
最初の「unless Rails.env.development?」は本番環境のみで動作させたい(開発環境ではデバッグ用の画面を出したい)ので入れています。開発時にはここを「unless Rails.env.production?」このようにしておけば開発環境下でも動作します。
今回はエラー時に表示されるview layoutをerrorディレクトリに入れるようにしました。viewsディレクトリの中にerrorディレクトリを作成しその中に「404.html.erb」と「500.html.erb」を作成してください。テスト表示ようにh1タグだけ適当になにか文字列を入れておきましょう。
これで準備OKです。この状態で存在しないディレクトリにアクセスしてみてください。そうすると今作成をした「404.html.erb」が表示されます。後はいつものようにviewを作っていけばOKです。