respond_to
についての以下の記事を読んだ。
respond_to without all the pain - Weissblog
詳しくは原文見て欲しいけど、用意していないフォーマットにアクセスされたときにどのように振る舞うかについて書かれている。
これまで、用意していないフォーマットにアクセスされた時は、僕は次のように、エラーページを強制的にhtmlフォーマットで表示するようにして対応していた(formats: [:html]
がないと、リクエストされたフォーマットでエラーページを表示しようとして更にエラーになる)。
rescue_from Exception, with: :error500
def error500(e)
render 'error500', status: 500, formats: [:html]
end
でもこれはちょっとおかしい。そもそこれは予想している挙動なので、ステータスコードは 500 ではない。かといって TemplateMissing を 406 などに紐付けるのもちょっとアレ(「あるべきテンプレートがない」という本来のケースを 406 にしてしまうケースがあり得る)。
なのでフォーマットを用意していないときに、ちゃんと UnknownFormat エラーにして、406 を返してあげるようにしたい。上のエントリでは、respond_to
をコントローラレベルで使用することで解決すると書いてあった。しかし試してみるとうまく動かない。ソースコードをざっと見た感じ、コントローラレベルのrespond_to
はrespond_with
と一緒に使うもののようだ。アクションレベルのrespond_to
は期待通り動いたけれど、すべてのアクションにrespond_to
を書くのはダルい…。
よってここをきちんとやりたかったら、新しく gem を作ってやるしかないのでは…という気分になってる。けど面倒なのでだれか作ってくれるといいなあ。
…時間あったら作ります。