Railsで開発している際、
404ページの作成だけだと respond_toを使用した場合、
指定したフォーマット以外のリクエストをすると、
ActionController::UnknownFormatのエラーが発生する。
htmlとjsonでformatを分けて開発することが多いけど
本番環境で.pngなんて良きせぬリクエストでエラー画面表示させるわけにもいかないので
このエラーを発生させない、回避する方法を書き溜めておく。
解決方法だけ先に、
不明なフォーマットはすべてformat.anyで捕まえる
不明なフォーマットはformat.anyで捕まえて、text/htmlで返す等と記述しておけばよい。
デフォルトとして指定しておくイメージ。
1 2 3 4 5 6 7 8 |
def index @items = Item.all respond_to do |format| format.any format.html format.json { render json: @items} end end |
これは
1 |
format.any { render json: @items} |
みたいに、jsonで返すなどと記述してもいい。
format.any対応前
anyを使用しないと、想定していないフォーマットリクエストでエラー発生。
1 2 3 4 5 6 7 8 9 10 11 |
1716 I, [2019-12-10T16:34:07.535808 #1] INFO -- : Completed 200 OK in 36ms (Views: 1.8ms | ActiveRecord: 12.3ms) 1717 I, [2019-12-10T16:34:07.571309 #1] INFO -- : Started GET "/assets/logo-a54663ss9013e94fdas3d415172d4fc68.gif" for 192.168.240.56 at 2019-12-10 16 :34:07 +0900 1718 I, [2019-12-10T16:34:07.701458 #1] INFO -- : Processing by ApplicationController#error_404 as GIF 1719 I, [2019-12-10T16:34:07.701544 #1] INFO -- : Parameters: {"path"=>"assets/logo-a54663ss9013e94fdas3d415172d4fc68"} 1720 I, [2019-12-10T16:34:07.701914 #1] INFO -- : Completed 406 Not Acceptable in 0ms (ActiveRecord: 0.0ms) 1721 F, [2019-12-10T16:34:07.702328 #1] FATAL -- : 1722 F, [2019-12-10T16:34:07.702575 #1] FATAL -- : ActionController::UnknownFormat (ActionController::UnknownFormat): 1723 F, [2019-12-10T16:34:07.702636 #1] FATAL -- : 1724 F, [2019-12-10T16:34:07.702658 #1] FATAL -- : app/controllers/application_controller.rb:14:in `render_error' 1725 app/controllers/application_controller.rb:11:in `error_404' |
format.any対応後
GIFとして認識して対応してくれている。
1 2 3 4 |
1731 I, [2019-12-10T16:36:36.632867 #1] INFO -- : Processing by ApplicationController#error_404 as GIF 1732 I, [2019-12-10T16:36:36.632959 #1] INFO -- : Parameters: {"path"=>"assets/logo-adfasdfaewewfwe12121234dsa"} 1733 I, [2019-12-10T16:36:36.642103 #1] INFO -- : No template found for ApplicationController#error_404, rendering head :no_content 1734 I, [2019-12-10T16:36:36.642266 #1] INFO -- : Completed 204 No Content in 9ms (ActiveRecord: 0.0ms) |
デフォルトの挙動として
そこそこ使う機会が多い印象。
じゃあね〜〜〜〜。