respond_to

这是来自 http://www.softiesonrails.comREST简明指南 ,共有5篇,本篇是第5篇。

通过上一讲,我们已经对REST on Rails的基本框架有所了解,但是它是如何实现根据客户端的请求类型来返回不同类型的资源表示的呢?这就是我们这一讲所要讲的,秘密就在于respond_to。

首先让我们来看看我们在上一讲中生成的airports控制器的代码:

  1. class AirportsController < ApplicationController
  2.   def index
  3.     @airports = Airport.find :all
  4.     respond_to do |format|
  5.       format.html # do nothing, allow Rails to render index.rhtml
  6.       format.js # do nothing, allow Rails to render index.rjs
  7.       format.xml { render :xml => @airports.to_xml }
  8.     end
  9.   end
  10. end

 

我们以index方法为例,其它方法的实现大同小异。第一行代码很容易理解,获取所有的机场信息,但是接下来的代码就比较费解了,而这也正是REST on Rails的关键所在,那个respond_to是做什么的呢?

我们知道,在HTTP协议中,客户端会在他们的HTTP首部包含一些元信息(meta-information),这些元信息按照“字段:值”的方式来组织,HTTP协议预定义了很多标准字段,其中的一个字段就是“Accept-type“,它代表发送请求的客户端能够支持或者说理解的资源表示类型,如果没有为这个键指定值,服务端会认为客户端能够理解标准的HTML文档,当然,客户端可以为这个字段指定任意的符合MIME规范的类型值,假设客户端设置这个字段为”Accept-Type: text/xml“,则服务端必须返回资源的XML表示。

所以respond_to事实上就是根据HTTP首部的Accept-Type字段来决定向客户端返回那种类型的资源表示,如果不使用respond_to,我们的实现可能会是这个样子:

  1. class AirportsController < ApplicationController
  2. # Pretend that Rails will call our index action,
  3.   # and will pass in the value of the Accept-Type header
  4.   def index(client_format)
  5.     @airports = Airport.find :all
  6.     if client_format == “text/html”
  7.       # TO DO: render the default template
  8.     elsif client_format == “application/javascript”
  9.       # TO DO: return some javascript
  10.     elsif client_format == “application/xml” || client_format == “text/xml”
  11.       # TO DO: return some XML back the client
  12.     # … more elsif statements here for each MIME type you want to support
  13.     end
  14.   end
  15. end

这很丑陋,不是吗?但它却相当直观,我想respond_to的作者可能最初也是这么写的,或者这段代码至少在他的脑海中闪现过,但立刻就被他否定了,因为它实在是太蹩脚了,所以他对这段代码进行了重整,于是有了respond_to。

  1. respond_to do |format|
  2.   format.html # do nothing, allow Rails to render index.rhtml
  3.   format.js # do nothing, allow Rails to render index.rjs
  4.   format.xml { render :xml => @airports.to_xml }
  5. end

但是Block内的代码看起来仍然比较古怪,事实上,如果我们理解了respond_to的设计思想,那么这段代码看起来就非常理所当然了。

respond_to基于这样的思想设计的,你不需要知道客户端的请求到底是那种类型,你只需要告诉Rails你准备支持那些类型的请求,Rails会自动帮你处理剩下的事情。

所以,这里我们告诉Rails,对于HTML和JS类型的请求,采用默认的实现,而对XML则使用我们在Block内提供的实现。

指南到这里就结束了,篇幅有限,我们只能对REST的基本概念和它在Rails中的简单实现做一个基本的介绍,REST on Rails的世界还有更多的东西等着你去探索。

 

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值