我正在将一个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/regions通过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
但在Rails3中,我找不到一种将其默认为XML响应的方法。有什么想法吗?
发布于 2011-01-21 04:17:10
如果我理解您的意图,您可以通过将默认资源格式设置为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
发布于 2011-06-29 18:41:31
我今天一直在与这个问题作斗争,我接受了你在评论中提到的before_filter
解决方案:
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
这个解决方案还考虑到了内容协商,这在我的情况下是一个因素。我希望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
发布于 2011-01-11 01:59:10
一个简单但丑陋的解决方案是覆盖html内容类型处理来呈现xml:
respond_to :html, :xml, :json
def index
@regions = Region.all
respond_with @regions do |format|
format.html { render :xml => @regions }
end
end
https://stackoverflow.com/questions/4643738
复制相似问题