我收到请求后如何更改请求的mime类型?

时间:2011-10-29 15:33:36

标签: ruby-on-rails-3 mime-types respond-to

我的客户将我的rails应用程序请求发送为XML或HTML。在rails 2.10下,我的控制器动作有一个带有wants.html和wants.xml的responds_to块。我的客户为Content-Type = text / xml和Accept = text / xml设置了他们的HTTP标头,如果他们想要XML并且几乎没有HTML的标题。工作得很好。

事实证明,我的大量客户一直省略了Accept = text / xml标头,但只要设置了Content-type = text / xml,respond_to块就会触发wants.xml。在rails3,如果设置了Accept = text / xml,则respond_to块(正确)仅触发wants.xml。

我不是让很多客户更改他们的程序,而是如何告诉rails3请求需要XML?我在想如果我看到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
但这似乎是蛮力。有没有更多的方法来实现这个目标?

1 个答案:

答案 0 :(得分:1)

尝试:

params[:format] = :xml

应该工作。