通过上一讲,我们已经对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 { render :xml => @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 { render :xml => @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,事实上,比你想象的要简单的多,不是吗?

祝你好运同时期待你的反馈!

rails respon_to相关推荐

  1. 诗歌rails之如何写一个简单的Rails Plugin

    生成plugin骨架代码: Ruby代码 ruby script\generate plugin MyPlugin ruby script\generate plugin MyPlugin 功能需求: ...

  2. 我的Rails笔记(1)

    <Agile Web Development With Rails>Notebook. 环境: Rails 3.1.0 Gem 1.8.10 Ruby ruby 1.9.2p180 1. ...

  3. [rails] 我的订餐系统 -- 小试ruby on rails(转)

    前言         近期在java社区中一种新的脚本语言ruby,及用ruby开发的一个wab框架 rails也热闹了起来.引起了不少的java开发人员的关注. 本人平时还是很少接触脚本语言方面东东 ...

  4. rails 添加外键_如何在Rails后端中添加功能强大的搜索引擎

    rails 添加外键 by Domenico Angilletta 通过多梅尼科·安吉列塔(Domenico Angilletta) In my experience as a Ruby on Rai ...

  5. ruby on rails_我成为了Ruby on Rails和React的贡献者,你也可以

    ruby on rails I am really grateful to have contributed to a few open source projects, including two ...

  6. 新手安装ruby on rails(ror)的成功必备手册

    2019独角兽企业重金招聘Python工程师标准>>> 如何快速正确的安装 Ruby, Rails 运行环境 每一位使用windows系统来进行ROR开发项目的都是这个世界上折翼的天 ...

  7. rails应用ajax之二:使用rails自身支持

    考虑另一种情况: 1. 页面上半部分显示当前的所有用户,页面下半部分是输入新用户的界面: 2. 每当输入新用户时,页面上半部分会动态更新新加用户的内容: 我们还是用ajax实现,不过这次用rails内 ...

  8. 例题6-2 铁轨(Rails, ACM/ICPC CERC 1997, UVa 514)

    栈应用 例题6-2 铁轨(Rails, ACM/ICPC CERC 1997, UVa 514) 错解 1.每次要把栈清空 2.不能用空的栈(栈顶)去比较 #include<iostream&g ...

  9. nginx rails 详细站点配置入门教程

    Ruby on Rails 是一个用于开发数据库驱动的网络应用程序的完整框架.Rails基于MVC(模型- 视图- 控制器)设计模式.从视图中的Ajax应用,到控制器中的访问请求和反馈,到封装数据库的 ...

最新文章

  1. Spring Security 5.5发布,正式实装OAuth2.0的第五种授权模式
  2. 科技在进步,一文带你看看 MATLAB R2020a 为工程师和科学家带来哪些 AI 功能?
  3. 堆排序(基于完全二叉树)
  4. 数据库对数字不限长度的冒泡排序
  5. 08_MinNumberInRotateArrary
  6. 如何使用FinalShell、FileZilla上传网站代码到服务器?这两个都是神器
  7. github使用总结
  8. 导出excel 文件
  9. 【车道线检测与寻迹】4月20 欧式、4D、8D、方向倒角距离ODT距离变换
  10. OC基础知识(面试必看)
  11. 笔记本连接显示器后没有声音_外接显示器后没声音怎么回事
  12. Ueditor编辑器插入外链视频支持手机播放【iframe标签】
  13. FMAN(Fully Motion-Aware Network for Video Object Detection)论文详读
  14. 网易的java开发_网易微专业java开发工程师2021
  15. amap 高德 地图打点 地图描点 描点居中 清除打点
  16. 2008 R2 Remote Desktop Server driver RDPDR.sys cannot be started, error 577
  17. 通达信日线数据转换为csv和excel格式
  18. Spring自带的工具类
  19. xmanager连接linux桌面教程 xmanager连接之后黑屏
  20. 用计算机术语形容人性格的词语,个人评价词语

热门文章

  1. XV6源代码阅读-虚拟内存管理
  2. 怎么批量修改照片的分辨率?照片dpi怎么调?
  3. C51玩8x8LED点阵:PointGame —— 收藏数爆炸的LED小游戏
  4. ubuntu进去安全模式_ubuntu 14.04全攻略
  5. 神经网络可以解决的问题,人工神经网络通过调整
  6. 清空了回收站的文件还能找回吗
  7. android迷宫图像生成,Android - 绘制一个迷宫,以平滑的角色移动的画布
  8. Sharding-JDBC 源码之 SQL 改写
  9. 光功率 博科交换机_交换机光功率
  10. STM32 Combined PWM的用法