私の顧客は私の 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
しかし、それは力ずくのようです。これを達成するためのより簡単な方法はありますか?