web-dev-qa-db-ja.com

Rails 3 respond_to:デフォルトのフォーマット?

Rails 2アプリケーションをRails 3.に変換しています。現在、次のようにコントローラーをセットアップしています。

class Api::RegionsController < ApplicationController
  respond_to :xml, :json
end

と、次のようなアクション:

def index
  @regions = Region.all

  respond_with @regions  
end

実装は非常に単純で、api/regions、api/regions.xml、およびapi/regions.jsonはすべて期待どおりに応答します。問題は、デフォルトでapi/regionsがXMLを介して応答することです。 XMLレスポンスを期待する消費者がいますが、どうしても必要な場合を除き、すべてのURLを変更して.xmlを含めるのは嫌です。

Rails 2では、これを行うことでそれを実現できます。

respond_to do |format|
  format.xml { render :xml => @region.to_xml }
  format.json { render :json => @region.to_json }
end

しかし、Rails 3では、XML応答にデフォルト設定する方法が見つかりません。アイデアはありますか?

57
bdorry

あなたがやろうとしていることを理解していれば、おそらくデフォルトのリソース形式をXMLに設定することで問題を解決できるでしょう。これにより、ユーザーは「api/regions」を使用してリクエストを作成し、デフォルトのレスポンスをXMLにすることができます。次の「コントローラーの名前空間とルーティング」セクションと「デフォルトの定義」セクションをご覧ください。

http://guides.rubyonrails.org/routing.html

Routes.rbで次のようなことができます。

namespace "api" do
  resources :regions, :defaults => { :format => 'xml' }
end

次に、コントローラーメソッドに対して次の作業を行えるようにします。

class Api::RegionsController < ApplicationController
  respond_to :xml, :json

  def index 
    respond_with(@regions = Region.all)
  end
end
80
Mike Clymer

私は今日この問題に取り組んでおり、before_filterあなたのコメントであなた自身に言及した解決策:

before_filter :default_format_xml

# Set format to xml unless client requires a specific format
# Works on Rails 3.0.9
def default_format_xml
  request.format = "xml" unless params[:format]
end

このソリューションでは、コンテンツネゴシエーションを考慮することもできます。これは私の場合の要因でした。 WebブラウザでHTMLビューを取得し、カスタムクライアント(Acceptヘッダーなし)でJSONを取得したかったのです。これは私の問題を解決しました:

before_filter :default_format_json

def default_format_json
  if(request.headers["HTTP_ACCEPT"].nil? &&
     params[:format].nil?)
    request.format = "json"
  end
end
49
clacke

あなたが望んでいるものではなく、関連しています:

def index
  @regions = Region.all
  respond_to do |format|
    format.json { render :json => @regions }
    format.any(:xml, :html) { render :xml => @regions }
  end
end

」に応答すると、anyを使用して異なる形式の共通ブロックを指定することもできます」

29
Heikki

さて、特定のレンダーコールで各フォーマットを明示的にレンダリングする必要があることに気づいたように、不明またはサポートされていないフォーマットのリクエストを回避することもできます。たとえば、default、次のように:

rescue_from ActionController::UnknownFormat, with: ->{ render nothing: true }

単純なブラウザー(exmp.firefox)行(開発モード)を使用して、不明な形式の呼び出しをシミュレートできます。

http://localhost/index.default

defaultという形式でルートコントローラーの:indexメソッドを呼び出します。