1

我有一个应用程序链接到一个控制器,比如/something/orders.xml使用 RABL 构造 XML 文档。有效,但似乎由于浏览器的请求标头,这在某些浏览器中以 text/html 的形式返回,例如 Chrome:

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

我希望得到回应,Content-type: text/xml因为它就是这样!所以,根据许多howtos和Rails Guides,你可以做

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_header在 Rails 3.0 之后不推荐使用设置选项。

如果您无法在您的操作中覆盖格式,您可以尝试直接修改您的 mime 类型。您可以将以下内容放入 Rails 中的初始化程序中:

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

此外,如果您使用 JQuery 并通过 ajax 检索 XML,则可以显式设置所需的内容类型。看到这个问题:Cannot proper set the Accept HTTP header with jQuery

编辑 2

如果一切都失败了,您可以使用:

ActionDispatch::Request.ignore_accept_header = true

在您的配置中完全关闭内容协商。正如我上面提到的,您可能想要控制您希望通过 ajax 请求接收的数据格式。如果是这样,那么您可以在https://github.com/econsultancy/rack-strip_http_accept_headers实现机架中间件更改。

于 2012-10-20T22:18:36.643 回答