25

すべての API コントローラーへのリクエストが JSON パスにリダイレクトされるように制限したいと考えています。URLも応答に応じて変更する必要があるため、リダイレクトを使用したいと思います。
1 つのオプションはbefore_filter、要求を同じアクションにリダイレクトするが、JSON 形式を強制する を使用することです。この例はまだ機能していません。

# base_controller.rb
class Api::V1::BaseController < InheritedResources::Base
  before_filter :force_response_format
  respond_to :json
  def force_response_format
    redirect_to, params[:format] = :json
  end
end

別のオプションは、ルート設定で形式を制限することです。

# routes.rb
MyApp::Application.routes.draw do
  namespace :api, defaults: { format: 'json' } do
    namespace :v1 do
      resources :posts
    end
  end
end

すべてのリクエストを JSON リクエストとして終わらせたい:

http://localhost:3000/api/v1/posts
http://localhost:3000/api/v1/posts.html
http://localhost:3000/api/v1/posts.xml
http://localhost:3000/api/v1/posts.json
...

どの戦略をお勧めしますか?

4

3 に答える 3

23

ルートにデフォルトを設定しても、すべてのリクエストが JSON リクエストに変換されるわけではありません。

あなたが望むのは、あなたがレンダリングしているものは何でもJSON応答であることを確認することです

これを行う必要があることを除いて、最初のオプションでほとんどそれを持っていました

before_filter :set_default_response_format

private
  def set_default_response_format
    request.format = :json
  end

これは Base API コントローラーの下にあるため、実際のアクションに到達したときの形式は常に JSON になります。

于 2013-02-02T17:14:23.313 に答える
17

404を返したい場合、または形式がそうでない場合にRouteNotFoundエラーを発生させたい場合は:json、次のようなルート制約を追加します。

JSON形式が必要:

# routes.rb
MyApp::Application.routes.draw do
  namespace :api, constraints: { format: 'json' } do
    namespace :v1 do
      resources :posts
    end
  end
end

詳細については、http: //edgeguides.rubyonrails.org/routing.html#request-based-constraintsをご覧ください 。

于 2013-02-02T20:39:45.743 に答える
5

ルート形式を使用する2番目のオプション。ユーザーが明示的にXML形式を要求した場合、JSON応答を受信しないようにする必要があります。このURLはXML形式または404に応答しないというメッセージが表示されるはずです。

ちなみに、私の意見では、そういうことすべてに対応するのはかなり簡単でしょう。

class FooController
  respond_to :xml, :json
  def show
    @bar = Bar.find(params[:id])
    respond_with(@bar)
  end
end
于 2013-02-02T17:08:03.693 に答える