1

私の顧客は私の Rails アプリのリクエストを XML または HTML として送信しています。Rails 2.10 では、私のコントローラー アクションには、wants.html と want.xml を含む Responds_to ブロックがありました。私の顧客は、XML が必要な場合は Content-Type=text/xml および Accept=text/xml の HTTP ヘッダーを設定し、HTML のヘッダーはほとんど使用しませんでした。うまくいきました。

私の顧客の多くは、Accept=text/xml ヘッダーを最初から省略していましたが、Content-type=text/xml を設定している限り、respond_to ブロックが want.xml を起動したことがわかりました。Rails3 では、Accept=text/xml が設定されている場合、respond_to ブロックは (正しく) want.xml のみを起動します。

多くの顧客にプログラムを変更してもらうのではなく、リクエストが XML を必要としていることを rails3 に伝えるにはどうすればよいでしょうか? Content-Type が text/xml に設定されている場合は、Accept も強制的に text/xml にしようと考えています。

request.env ハッシュを次のように直接変更してみました。

class MyController < ApplicationController

def my_xml_or_html_action
  if request.env['CONTENT_TYPE'].to_s.match(/xml/i)
    request.env['HTTP_ACCEPT'] = 'text/xml'
  end
  respond_to do |wants|
    wants.html { redirect_to html_response }
    wants.xml { render xml_response }
  end
end

しかし、それはうまくいきませんでした。Respond_to を完全に放棄して、次のようにすることもできます。

class MyController < ApplicationController

def my_xml_or_html_action
  if request.env['CONTENT_TYPE'].to_s.match(/xml/i)
    redirect_to html_response
  else
    render xml_response
  end
end

しかし、それは力ずくのようです。これを達成するためのより簡単な方法はありますか?

4

1 に答える 1

1

試す:

params[:format] = :xml

動作するはずです。

于 2011-10-29T16:11:24.633 に答える