我正在将Rails 2应用程序转换为Rails 3.我目前的控制器设置如下:
class Api::RegionsController < ApplicationController
respond_to :xml, :json
end
with和一个如下所示的操作:
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
但在Rails 3中,我找不到将其默认为XML响应的方法。有什么想法吗?
答案 0 :(得分:79)
如果我理解您要做的事情,您可以通过将默认资源格式设置为XML来解决问题。这将允许您的用户使用“api / regions”发出请求,并将响应默认为XML。请查看“Controller Namespaces and Routing”和“Defining Defaults”部分:
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
答案 1 :(得分:49)
我今天一直在讨论这个问题,我在你的评论中找到了你自己提到的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
答案 2 :(得分:29)
不是你追求的但是相关的:
def index
@regions = Region.all
respond_to do |format|
format.json { render :json => @regions }
format.any(:xml, :html) { render :xml => @regions }
end
end
“响应也允许您使用任何”
指定不同格式的公共块答案 3 :(得分:0)
嗯,正如您已经注意到每个格式都应该使用特定的渲染调用显式呈现,您还可以避免任何具有未知或不支持格式的请求,我的示例名为默认,如下所示:
rescue_from ActionController::UnknownFormat, with: ->{ render nothing: true }
您可以使用简单浏览器(exmp.firefox)行模拟未知格式调用(在开发模式下):
http://localhost/index.default
它会调用根控制器的:index
方法,格式为默认。
答案 4 :(得分:-1)
一个简单但丑陋的解决方案是覆盖html内容类型处理以呈现xml:
respond_to :html, :xml, :json
def index
@regions = Region.all
respond_with @regions do |format|
format.html { render :xml => @regions }
end
end