繁体   English   中英

Rails 3 respond_to:默认格式?

[英]Rails 3 respond_to: default format?

我正在将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

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

如果我了解您要执行的操作,则可以通过将默认资源格式设置为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

我今天一直在讨论这个问题,我在你的评论中找到了你自己提到的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

不是你想要的但是相关的:

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

“响应也允许您使用任何”指定不同格式的公共块“

好吧,正如您已经注意到每个格式应该使用特定的渲染调用显式呈现,您也可以避免任何具有未知或不支持格式的请求,我的示例名为default ,如下所示:

rescue_from ActionController::UnknownFormat, with: ->{ render nothing: true }

您可以使用简单的浏览器(exmp.firefox)行模拟未知格式调用(在开发模式下):

http://localhost/index.default

它将调用:index根控制器的:index方法,其格式称为默认值

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

   respond_to :html, :xml, :json

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM