おもしろwebサービス開発日記

Ruby や Rails を中心に、web技術について書いています

railsにおけるformatの取り扱いについて

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_torespond_withと一緒に使うもののようだ。アクションレベルのrespond_toは期待通り動いたけれど、すべてのアクションにrespond_toを書くのはダルい…。

よってここをきちんとやりたかったら、新しく gem を作ってやるしかないのでは…という気分になってる。けど面倒なのでだれか作ってくれるといいなあ。

…時間あったら作ります。