Rails 3的respond_to:默认格式?

我正在转换Rails 2应用程序到Rails 3.我目前有一个控制器设置如下:

class Api::RegionsController < ApplicationController respond_to :xml, :json end 

与一个行动,如下所示:

 def index @regions = Region.all respond_with @regions end 

实现非常简单,api / regions,api / regions.xml和api / regions.json都可以按照您的预期进行响应。 问题是,我希望API /地区默认情况下通过XML响应。 我有消费者期望XML响应,我恨他们改变他们所有的URL包括.xml,除非绝对必要。

在Rails 2中,你可以这样做:

 respond_to do |format| format.xml { render :xml => @region.to_xml } format.json { render :json => @region.to_json } end 

但在Rails 3中,我找不到将其默认为XML响应的方法。 有任何想法吗?

如果我明白你要做什么,你可能可以通过将默认的资源格式设置为XML来解决这个问题。 这将允许您的用户使用“api / regions”发出请求,并将响应默认为XML。 看看“控制器名称空间和路由”和“定义默认值”部分:

http://guides.rubyonrails.org/routing.html

您可以在routes.rb中执行以下操作:

 namespace "api" do resources :regions, :defaults => { :format => 'xml' } end 

那么你应该可以为你的控制器方法做以下工作:

 class Api::RegionsController < ApplicationController respond_to :xml, :json def index respond_with(@regions = Region.all) end end 

我今天一直在处理这个问题,并且我在你的评论中提到你自己提到的before_filter解决scheme:

 before_filter :default_format_xml # Set format to xml unless client requires a specific format # Works on Rails 3.0.9 def default_format_xml request.format = "xml" unless params[:format] end 

这个解决scheme还可以考虑到内容协商,这在我的情况下是一个因素。 我希望Web浏览器获取HTML视图,但是自定义客户端(没有Accept标头)获取JSON。 这解决了我的问题:

 before_filter :default_format_json def default_format_json if(request.headers["HTTP_ACCEPT"].nil? && params[:format].nil?) request.format = "json" end end 

不是你所追求的,而是相关的:

 def index @regions = Region.all respond_to do |format| format.json { render :json => @regions } format.any(:xml, :html) { render :xml => @regions } end end 

“响应也允许你指定一个通用的块为不同的格式通过使用任何”

一个简单但难看的解决scheme是重写html内容types处理来呈现xml:

  respond_to :html, :xml, :json def index @regions = Region.all respond_with @regions do |format| format.html { render :xml => @regions } end end