首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Rails 3 respond_to:默认格式?

Rails 3 respond_to:默认格式?
EN

Stack Overflow用户
提问于 2011-01-10 12:44:30
回答 3查看 55.6K关注 0票数 57

我正在将一个Rails 2应用程序转换到Rails 3。我目前已经设置了一个控制器,如下所示:

代码语言:javascript
复制
class Api::RegionsController < ApplicationController
  respond_to :xml, :json
end

和一个类似以下内容的操作:

代码语言:javascript
复制
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中,您可以通过执行以下操作来实现:

代码语言:javascript
复制
respond_to do |format|
  format.xml { render :xml => @region.to_xml }
  format.json { render :json => @region.to_json }
end

但在Rails3中,我找不到一种将其默认为XML响应的方法。有什么想法吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-01-21 04:17:10

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

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

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

代码语言:javascript
复制
namespace "api" do
  resources :regions, :defaults => { :format => 'xml' }
end

然后,您应该能够对您的控制器方法进行以下工作:

代码语言:javascript
复制
class Api::RegionsController < ApplicationController
  respond_to :xml, :json

  def index 
    respond_with(@regions = Region.all)
  end
end
票数 81
EN

Stack Overflow用户

发布于 2011-06-29 18:41:31

我今天一直在与这个问题作斗争,我接受了你在评论中提到的before_filter解决方案:

代码语言:javascript
复制
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。这解决了我的问题:

代码语言:javascript
复制
before_filter :default_format_json

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

Stack Overflow用户

发布于 2011-01-11 01:59:10

一个简单但丑陋的解决方案是覆盖html内容类型处理来呈现xml:

代码语言:javascript
复制
   respond_to :html, :xml, :json

   def index
      @regions = Region.all
      respond_with @regions do |format|
        format.html { render :xml => @regions }
      end
    end
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4643738

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档