「.png」「.jpg」などの拡張子が付くパスだと、「404」のエラーハンドリングが機能せず「Missing template」になる問題(Rails)

f:id:ryoutaku_jo:20190722235228p:plain

【結論】

・存在しないパスにアクセスした場合、エラーハンドリング で指定した「404」のビューファイルに飛ぶ様に設定しているにも関わらず、「.png」や「.jpg」といった拡張子で終わるパスにアクセスした場合、「Missing template」になることがある。

・「.png」などの拡張子で終わるパスにアクセスすると、formatsが[:png]などになるが、デフォルトのフォーマットはhtmlなので、指定したファイルが「.png」で無いと「missing template」が返ってしまい、エラーハンドリング が出来ない事が原因。

・この場合、html以外のformatsに対する処理も記述すれば改善する

【目次】

【本題】

事象:「.png」「.jpg」などの拡張子が付くパスだと、エラーハンドリングが機能しない

存在しないパスなどにアクセスしてrouting error(404)になった場合、rescue_fromでエラーをキャッチして、独自の404ページに飛ばす様に設定しているにも関わらず、「Missing template」が発生する事があります。

今回はその原因と対策について、まとめます。

なお、エラーは、「.png」「.jpg」などの拡張子が付く存在しないパスにアクセスした際に発生しています。

※エラーハンドリング については、過去記事参照

ryoutaku-jo.hatenablog.com

ryoutaku-jo.hatenablog.com

ryoutaku-jo.hatenablog.com

原因:エラーハンドラ内のメソッドがhtml形式以外のリクエストを処理できない

以下が実際のエラー画面ですが、:formats=>[:png]となっている事が分かります。

f:id:ryoutaku_jo:20190723000200p:plain

拡張子をパスに指定すると、その拡張子(フォーマット)に対応したテンプレートを探し出します。

しかし、エラーページを読み込み処理は、以下の様に記述されています。

render 'errors/error_404', status: :not_found

また、errorsフォルダ配下にはpng形式などのファイルは存在しません。

その為、フォーマットに対応したテンプレートが存在しないので、エラーハンドリング 出来ず、「Missing template」となっていました。

対策:html以外のフォーマットはエラーハンドラにリダイレクトさせる

「.png」などでも404エラーを返したい場合は、以下の様に、html以外のフォーマットは404ハンドラにリダイレクトさせる処理を追記する事で改善されます。

respond_to do |format|
  format.html { render 'errors/error_404', status: :not_found, layout: 'lp' }
  format.all { redirect_to controller: 'errors', action: 'not_found' }
end

参考情報

actionview - Internal server error 500 on missing image file (Rails 3.2.12) - Stack Overflow

Ruby on Rails4.2で.pngや.jpgや.jsonへの404エラー対応 - Qiita

Rails: Missing template エラーの扱い - Qiita

《今日の学習進捗(3年以内に10000時間に向けて)》

土日にスクラムガイドとScrumBoot Campを読んだが、現在の開発をより効果的に進められる可能性を感じた。

現状の運用方法をより効果的に変えられる余地があるので、運用方法の理解に努めたい。

また本日、CTOとの1on1にて、障害対応に強くなるためのはどうすれば良いか助言を求めたが、やはり一朝一夕で身につくものではなく、地道に経験を積んでいく必要があると改めて実感した。

まずは、自身のサービスを守るという意識を強く持った上で、アドバイス頂いた以下3点を意識して、今後の開発に取り組みたい。

・自身が担当していないコードを読んで全体の仕様把握に努める(コードレビュー含む)

・問題発生の可能性があるコードを、未然に修正を行う

・障害発生時は、貴重な機会と捉えて、能動的に問題解決に取り組む

学習開始からの期間 :227日
今日までの合計時間:2176h
一日あたりの平均学習時間:9.6h
今日までに到達すべき目標時間:2073h
目標との解離:103h
「10,000時間」まで、

残り・・・「7824時間!」