Ruby on Rails 入门 ----respond_to

字面意思是响应给。。。我们可以理解为,你要什么格式。

以往一样的操作返回不同的格式,我们大多会这样处理:

 

[Java]  view plain  copy
  1. def show_html  
  2. @users = User.find(:all)  
  3. end  
  4. def show_xml  
  5. @users = User.find(:all)  
  6. render :xml => @user.to_xml  
  7. end  
  8. def show_json  
  9. @user = User.find(:all)  
  10. render :json => @user.to_json  
  11. end  

 

有了respond_to,我们可以简化成这样的处理:

 

[Java]  view plain  copy
  1. def index  
  2.   @users = User.find(:all)  
  3.   respond_to do |format|  
  4.     format.html # index.html.erb  
  5.     format.xml { render :xml => @user.to_xml }  
  6.     format.json { render :xml => @user.to_json }  
  7.     end  
  8. end  

 

这种设计师符合ROR设计原则的(Don’t repeat yourself)

我们只需要定义一个action,只需要定义不同的格式就可以了。

我们看看都支持哪些格式

 

• format.html

• format.xml

• format.js

• format.json

• format.atom

• format.rss

• format.csv

• format.xls

• format.yaml

• format.txt

• more....

 

足够丰富了吧。

接下来就有疑问了,Rails是怎么知道我们想要什么格式的呢?

1)根据URL判断 

[Java]  view plain  copy
  1. <%= link_to ‘User List’, users_path( :format => :xml) %>  

生成代码如下:

[Java]  view plain  copy
  1. <a href=”/users.xml”>User List</a>  

2)根据http header判断(Ajax调用时加以设定)

[Java]  view plain  copy
  1. GET /users HTTP/1.1  
  2. Host: localhost:3000  
  3. User-Agent: Mozilla/5.0 (Macintosh; U; Intel Mac OS X; zh-TW; rv:1.8.1.13)  
  4. Gecko/20080311 Firefox/2.0.0.13  
  5. Accept: text/javascript, text/html, application/xml, text/xml, */*  
  6. Accept-Language: zh-tw,en-us;q=0.7,en;q=0.3  
  7. Accept-Encoding: gzip,deflate  
  8. Accept-Charset: Big5,utf-8;q=0.7,*;q=0.7  
  9. Keep-Alive: 300  
  10. Connection: keep-alive  
  11. X-Requested-With: XMLHttpRequest  
  12. X-Prototype-Version: 1.6.0.1  

3)根据params[:format]参数设定

GET /users/1?format=xml

4)直接在代码中设定,在方法内部写代码:

 

[Java]  view plain  copy
  1. request.format = :xml  

 

5)自定义格式

 

[Java]  view plain  copy
  1. # config/initializers/mime_types.rb  
  2. Mime::Type.register ‘audio/mpeg’, :mp3?Mime::Type.register ‘audio/mpegurl’, :m3u  

通过连接访问:http://localhost:3000/mp3s/1.mp3

代码如下:

 

[Java]  view plain  copy
  1. def show  
  2. @mp3 = Mp3.find(params[:id])  
  3. respond_to do |format|  
  4. format.html  
  5. format.mp3 { redirect_to @mp3.url }  
  6. format.m3u { render :text => @mp3.url }  
  7. end  
  8. end  

现在我们知道如何定义响应格式了,但是这些响应格式跟模板是如何结合的呢?

先看一个文件名:

index.html.erb

包含了三个部分,文件名(index),minetype即format(html),模板生成器即renderer(erb)

最常见的erb有ruby语言写成,用来生成常用的html格式的文件。

<h1><%= @event.name %></h1>

erb将index.html.erb文件渲染为html文件

<h1>OSDC 2008</h1>

另外一种常见的是生成XML的builder

文件名为:show.xml.builder

 

[Java]  view plain  copy
  1. xml.instruct!  
  2. xml.title "This is a title"  
  3. xml.person do  
  4. xml.first_name "Ryan"  
  5. xml.last_name "Raaum"  
  6. end  

渲染为:

 

[Java]  view plain  copy
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <title>This is a title</title>  
  3. <person>  
  4. <first_name>Ryan</first_name>  
  5. <last_name>Raaum</last_name>  
  6. </person>  

再看看atom feed(一种rss)

index.atom.builder

理论一堆,回到我们之前的events实例中,看看如何应用吧:

首先修改:events_controller.rb 的 index 方法

在最后加入

[Java]  view plain  copy
  1. respond_to do |format|  
  2.   format.html  
  3.   format.xml { render :xml => @events.to_xml }  
  4.   format.json { render :json => @events.to_json }  
  5.   format.atom { @feed_title = "My event list" } # index.atom.builder  
  6. end  

新建app/views/events/index.atom.builder文件,内容如下:

[Java]  view plain  copy
  1. atom_feed do |feed|  
  2.   feed.title( @feed_title )  
  3.   feed.updated( @events.last.created_at )  
  4.   @events.each do |event|  
  5.     feed.entry(event) do |entry|  
  6.       entry.title( event.name )  
  7.       entry.content( event.description, :type => 'html' )  
  8.     end  
  9.   end  
  10. end  

 

然后用上面的URL访问方式看看,是否成功得到了不同格式的数据。

http://127.0.0.1:3000/events.xml

http://127.0.0.1:3000/events.json

http://127.0.0.1:3000/events.atom

转自:http://blog.csdn.net/maxiaokundage/article/details/19162547

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值