1

/something/orders.xmlRABLを使用してXMLドキュメントを作成するようなコントローラーへのリンクを備えたアプリがあります。動作しますが、ブラウザのリクエストヘッダーが原因で、Chromeなどの一部のブラウザではtext/htmlとして返されるようです。

Accept:text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8

それがそれであるため、私は応答を持って欲しいContent-type: text/xmlです!したがって、多くのハウツーとRailsガイドによると、次のことができます。

config.action_controller.use_accept_header = false

application.rb。しかし、これは現在、次の結果になっていundefined method use_accept_header=ます。

/home/sbeam/.rvm/gems/ruby-1.9.3-p194@global/gems/actionpack-3.2.6/lib/action_controller/railtie.rb:41:in `block (3 levels) in <class:Railtie>': undefined method `use_accept_header=' for ActionController::Base:Class (NoMethodError)
4

1 に答える 1

3

次のように設定することにより、コントローラーのアクションでコンテンツタイプをオーバーライドできるはずですresponse.headers

respond_to do |format|
  format.html
  format.json { render :json => @orders }
  format.xml do
    response.headers['content-type'] = 'text/xml'
    render :xml => @orders
  end
end

編集

use_accept_headerRails 3.0 以降、設定するオプションは非推奨になりました。

アクションでフォーマットをオーバーライドできない場合は、MIME タイプを直接変更してみてください。Rails のイニシャライザに以下を入れることができます。

Mime.send(:remove_const, :xml)
Mime::Type.register "text/xml", :xml

また、JQuery を使用して ajax 経由で XML を取得している場合は、必要なコンテンツ タイプを明示的に設定できます。次の質問を参照してください: jQuery で Accept HTTP ヘッダーを適切に設定できません

編集 2

他のすべてが失敗した場合は、次を使用できます。

ActionDispatch::Request.ignore_accept_header = true

構成で、コンテンツ ネゴシエーションを完全にオフにします。上で述べたように、ajax リクエストを介して受信したいデータ形式を制御したい場合があります。その場合は、代わりにhttps://github.com/econsultancy/rack-strip_http_accept_headersでラック ミドルウェアの変更を実装できます。

于 2012-10-20T22:18:36.643 に答える