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応答にデフォルト設定する方法が見つかりません。アイデアはありますか?
あなたがやろうとしていることを理解していれば、おそらくデフォルトのリソース形式を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
私は今日この問題に取り組んでおり、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
あなたが望んでいるものではなく、関連しています:
def index
@regions = Region.all
respond_to do |format|
format.json { render :json => @regions }
format.any(:xml, :html) { render :xml => @regions }
end
end
」に応答すると、anyを使用して異なる形式の共通ブロックを指定することもできます」
さて、特定のレンダーコールで各フォーマットを明示的にレンダリングする必要があることに気づいたように、不明またはサポートされていないフォーマットのリクエストを回避することもできます。たとえば、default、次のように:
rescue_from ActionController::UnknownFormat, with: ->{ render nothing: true }
単純なブラウザー(exmp.firefox)行(開発モード)を使用して、不明な形式の呼び出しをシミュレートできます。
http://localhost/index.default
defaultという形式でルートコントローラーの:index
メソッドを呼び出します。