respond_to可以讓你根據客戶端要求的格式進行不同的格式回應,以 RESTful 與 Rails 中完成的應用程式首頁為例,若想要客戶端在請求http://localhost:3000/bookmarks.html、http://localhost:3000/bookmarks.xml、http://localhost:3000/bookmarks.json時,分別給HTML、XML、JSON格式回應,可以如下修改:

  • bookmarks_controller.rb
class BookmarksController < ApplicationControllerdef index@pages = Page.all
        respond_to do |format|format.htmlformat.xml { render :xml => @pages }format.json { render :json => @pages }endend...
end

上例中,respond_to傳入的區塊參數format是ActionController::MimeResponds::Collector實例,程式區塊中format.html表示如果是.html結尾請求,執行預設的render方法,format.xml、format.json表示如果是.xml或.json,執行方法後程式區塊的內容,依範例程式則是分別是指定呈現XML與JSON格式。如果想要設定預設處理,可以使用format.any方法。例如:

respond_to do |format|
    format.html
    format.xml { render :xml => @pages }
    format.json { render :json => @pages }
    format.any { render :text => "Orz" }
end

實際上,如果要整個控制器可依客戶端請求格式進行回應,可以如下:

class SomesController < ApplicationController
    respond_to :html, :xml, :json

def index
        ...
        respond_with(Some.all)
    end
end

在類別層級宣告控制器支援的格式,然後動作中使用respond_with,指定要呈現的物件,就會自動客戶端請求的格式,傳回對應的格式回應。respond_with也接受程式區塊,用以重新定義預設的render行為。例如:

respond_with(Some.all) do |format|
    format.html { render } 
end

respond_to或respond_with的區塊參數format,如果format.html後沒有設定程式區塊,預設會尋找index.html.erb進行回應,同理,如果format.xml或format.json沒有設定程式區塊,預設會尋找index.xml.erb或index.json.erb進行回應。Erb是Embedded Ruby,也就是可內嵌Ruby程式碼的樣版檔案,你也可以使用Builder檔案,也就是副檔名為.builder的檔案。例如:

  • bookmarks_controller.rb
class BookmarksController < ApplicationControllerdef index@pages = Page.all
        respond_to do |format|format.htmlformat.xmlformat.json { render :json => @pages }endend...
end

format.xml沒有設定程式區塊,因此優先尋找.xml.erb,如果沒有的話,再尋找.xml.builder,如果這邊僅設定index.xml.bulder如下:

  • index.xml.builder
xml.pages do                                  # 根節點 <pag es></pages>@pages.each do |page|xml.page do                           # 節點 <page></page>xml.title page.title               # 節點 <title></title>xml.url page.url                   # 節點 <url></url>xml.description page.description   # 節點 <description></description>endend
end

如上產生的XML會是:

<pages>
  <page>
    <title>Openhome</title>
    <url>http://openhome.cc</url>
    <description>Orzxxxxxxx</description>
  </page>
  <page>
    <title>xxx</title>
    <url>http://xxx</url>
    <description>測試</description>
  </page>
  ...
</pages>

Rails內建的格式支援包括有:html、:xml、:json、:text、:js、:css、:ics、:csv、:rss、:atom、:yaml等,可以編輯config/initializers/mime_types.rb來註冊新的格式支援。

respond_to 和 respond_with相关推荐

  1. ruby 中的respond_to (转)

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

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

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

  3. respond_to的解释

    DOC中有一段话这么解释respond_to的: "Rails determines the desired response format from the HTTP Accept hea ...

  4. #Ruby# Introspect (1)

    Introspect,内省,是指从程序自身出发,审视程序各方面的能力.这个过程又称为Reflection,反射. 孔子曰,吾日三省吾身.于人于程序,内省都是非常重要的. 1. Looking at o ...

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

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

  6. rspec 测试页面元素_如何使用共享示例使您的RSpec测试干燥

    rspec 测试页面元素 by Parth Modi 由Parth Modi 如何使用共享示例使您的RSpec测试干燥 (How to DRY out your RSpec Tests using S ...

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

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

  8. Rails全局处理Error

    好久不写了,blog密码差点忘掉... 网上有好多处理error的方法,新建一个controller,修改route可以自定义统一的error处理页面.下面我有个方法,和大家分享一下: 查看Rails ...

  9. IronRuby:元编程特性【method_missing】的使用

    在OpenExpressApp中写的自动化测试用例片段如下,之所以能这么易读,是因为可以使用Ruby的method_missing来进行方法调用: 打开模块 "部门管理" # 1 ...

最新文章

  1. opencv随机数的产生
  2. 按home退出程序到后台后再打开崩溃的问题
  3. 网络学习(七)Windows XP系统之纯净版安装
  4. 51单片机——LCD1602
  5. OpenCV与图像处理学习七——传统图像分割之阈值法(固定阈值、自适应阈值、大津阈值)
  6. [转载] 将一个整数型字符串转换为一个整数
  7. Java TCP小结
  8. FPGA中for语句描述的七人投票表决器
  9. Kubernetes之YAML语法
  10. 有道词典 linux 无法运行,ubuntu16.04安装不上有道词典的解决办法
  11. html设置图像边框的属性,css3将图像设置为元素周围边框的方法
  12. DB2日期函数DATE函数
  13. 【论文阅读】Image Super-Resolution Using Deep Convolutional Networks
  14. 古希腊神话故事3 :丢卡利翁和皮拉
  15. Android 实现定时闹铃功能
  16. 创建项目执行计划的5个简单步骤
  17. java 图片合并成pdf_java将多张图片合并转为PDF
  18. 安卓课堂考勤管理系统
  19. 中国边缘公有云市场份额,网心科技位居第四名
  20. 实现全国组织机构代码校验

热门文章

  1. 多路分支之月份天数计算
  2. 易语言大漠内存找图的实现
  3. 电子商务系统的设计与实现(十一):数据库设计
  4. C语言雪花算法,记一次雪花算法的实现
  5. echarts 柱状图,每根柱子显示不同颜色
  6. php的核心架构如下图,thinksns 核心架构及目录结构
  7. 两台计算机怎么快速拷贝文件夹,两台电脑,用什么方法相互传文件最快?
  8. 王半仙儿的日记-0004
  9. DEEP AUTOENCODING GAUSSIAN MIXTURE MODEL FOR UNSUPERVISED ANOMALY DETECTION
  10. 二级计算机11月份考试,2020年12月计算机二级考试报名时间及考试安排