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

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

class AirportsController < ApplicationController
  def index
    @airports = Airport.find :all
    respond_to do |format|
      format.html # do nothing, allow Rails to render index.rhtml
      format.js # do nothing, allow Rails to render index.rjs
      format.xml { renderml => @airports.to_xml }
    end
  end
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,我们的实现可能会是这个样子:

class AirportsController < ApplicationController

# Pretend that Rails will call our index action,
  # and will pass in the value of the Accept-Type header
  def index(client_format)
    @airports = Airport.find :all

if client_format == “text/html”
      # TO DO: render the default template

elsif client_format == “application/javascript”
      # TO DO: return some javascript

elsif client_format == “application/xml” || client_format == “text/xml”
      # TO DO: return some XML back the client

# … more elsif statements here for each MIME type you want to support
    end
  end
end

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

respond_to do |format|
  format.html # do nothing, allow Rails to render index.rhtml
  format.js # do nothing, allow Rails to render index.rjs
  format.xml { renderml => @airports.to_xml }
end

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

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

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

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

我建议你尝试动手创建一个Rails应用,然后试试scaffold_resource生成器,阅读并试着理解生成的代码,然后尝试修改view和controller,事实上,比你想象的要简单的多,不是吗?

转载于:https://www.cnblogs.com/fly871117/archive/2010/08/09/1795803.html

ruby 中的respond_to (转)相关推荐

  1. 丑小鸭的故事--ruby中的方法

    #ruby中的方法可以是类方法,可以是实例方法,还可是是自己的单件方法 #我们先来一只传统的鸭子 class Quackerdef initialize@vox='quack,quack'enddef ...

  2. rails 中的respond_to 对不同的文件要求给予相应

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

  3. Ruby中的设计模式

    继续 上 节讲述过的Singleton . Proxy 及 Iterator各模式,本节再来考察几个别的设计模式.下面按顺序来考察 Prototype . Template Method 和 Obse ...

  4. Ruby中的设计模式——《松本行弘的程序世界》

    < 设计模式 > 一书是用C++ 和 Smalltalk 介绍模式实例的.看了那些例子,大家都会感觉到,绝大多数的模式用 Smalltalk 实现起来非常简单.这是为什么呢? 因为Smal ...

  5. Ruby中爬虫的实现

    2019独角兽企业重金招聘Python工程师标准>>> Ruby中实现网页抓取,一般用的是mechanize,使用非常简单. 安装 sudo gem install mechaniz ...

  6. Ruby中的require_relative和require有什么区别?

    本文翻译自:What is the difference between require_relative and require in Ruby? Ruby中的require_relative和re ...

  7. 在Ruby中获取system()调用的输出

    本文翻译自:Getting output of system() calls in Ruby 如果我在Ruby中使用Kernel#system调用命令,我该如何获得它的输出? system(" ...

  8. 为什么在Ruby中使用`rescue Exception =gt; e`样式不好?

    本文翻译自:Why is it bad style to `rescue Exception => e` in Ruby? Ryan Davis's Ruby QuickRef says (wi ...

  9. map(&:name)在Ruby中是什么意思?

    我在RailsCast中找到了以下代码: def tag_names@tag_names || tags.map(&:name).join(' ') end 什么是(&:name)在m ...

最新文章

  1. 5.STM32外设都有哪几类寄存器?(详解)
  2. 万能进制转换计算器_这7款计算器APP一定会让你感到惊艳!
  3. java 负数 位移运算_Java中的位移运算
  4. 【数据结构基础复习】二叉树的非递归遍历(二)
  5. SAP License:员工离职分析
  6. GCD(Grand Central Dispatch)和Block 使用-浅析
  7. Unity之Touch触摸屏单指、多指触碰
  8. Excel表格进行10进制/16进制换算
  9. 逆置单链表——递归与非递归
  10. 分支定界 matlab,使用MATLAB实现分枝定界法求解整数规划的详细资料说明
  11. Java中一维数组的内存解析(浅显易懂,新手必看)
  12. 运行wordcount程序
  13. 基于扩张观测器(LESO)的滑模控制
  14. 东邪西毒 - 台词全本
  15. WSL(Windows Subsystem for Linux)升级到WSL2时报错:由于虚拟磁盘系统限制,无法完成请求的操作
  16. 世界移动通信大会 阿里云去了干吗?
  17. 简单的鼠标和键盘事件+阻止默认阻止冒泡+dom0,dom2
  18. 软件工程-第一章 介绍
  19. python视频拼接两个视频流合成一个视频流
  20. psservice.exe

热门文章

  1. 解决uni-app微信小程序input输入框在底部时,键盘弹起页面整体上移问题
  2. 苹果选了天猫 天猫成了618
  3. 联合国农产品数据分析
  4. koa2.x--art-template
  5. Java进阶教程-马士兵
  6. html表白程序源码 html生日快乐网站制作 HTML生日快乐代码 表白程序源码html 程序员表白代码html
  7. Vue2.0面试题集合
  8. 腾讯发布“天眼云镜”主机安全产品
  9. UVA 1471 Defense Lines (STL + 二分)
  10. AOP的理解以及实现