14

json のみである私の Rails アプリでは、誰かが application/json 以外に設定された Accept ヘッダーを使用して Rails アプリを呼び出すたびに、406 コードを送信したいと考えています。また、コンテンツタイプを application / json 以外に設定したときに 415 を送信したい

私のコントローラーには、respond_to :json が配置されています。すべてのアクションでjsonのみをレンダリングします。ただし、他のすべてのアクセプトヘッダー/コンテンツタイプに対して呼び出され、フォーマットがjson以外に設定されているすべての呼び出しに対して、エラーコード406/415を確実に返すにはどうすればよいですか。

例えば。私のリソースがbooks/1の場合、books/1.jsonまたはbooks/1を受け入れヘッダーとコンテンツタイプにapplication/jsonで許可したい

これら2つのアクションを実行する方法について何かアイデアはありますか?

4

3 に答える 3

36

基本的に、2 つの方法で応答を制限できます。

まず、respond_toコントローラー用です。406 Not Acceptable定義されていないフォーマットのリクエストが行われた場合、これは自動的に をトリガーします。

例:

class SomeController < ApplicationController
  respond_to :json


  def show
    @record = Record.find params[:id]

    respond_with @record
  end
end

before_filterもう 1 つの方法は、フォーマットをチェックしてそれに応じて対応する a を追加することです。

例:

class ApplicationController < ActionController::Base
  before_filter :check_format


  def check_format
    render :nothing => true, :status => 406 unless params[:format] == 'json' || request.headers["Accept"] =~ /json/
  end
end
于 2013-01-29T09:46:32.023 に答える
9

ApplicationController の before_filter でそれを行うことができます

before_filter :ensure_json_request

def ensure_json_request
  return if params[:format] == "json" || request.headers["Accept"] =~ /json/
  render :nothing => true, :status => 406
end
于 2013-01-29T09:45:35.553 に答える