Ruby on Rails 之旅(七)—— Ruby on Rails 入门(5)

Stella981
• 阅读 524

接下来我们一起学习一下respond_to

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

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

def show_html
@users = User.find(:all)
end
def show_xml
@users = User.find(:all)
render :xml => @user.to_xml
end
def show_json
@user = User.find(:all)
render :json => @user.to_json
end

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

def index
  @users = User.find(:all)
  respond_to do |format|
    format.html # index.html.erb
    format.xml { render :xml => @user.to_xml }
    format.json { render :xml => @user.to_json }
    end
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判断

<%= link_to ‘User List’, users_path( :format => :xml) %>

生成代码如下:

<a href=”/users.xml”>User List</a>

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

GET /users HTTP/1.1
Host: localhost:3000
User-Agent: Mozilla/5.0 (Macintosh; U; Intel Mac OS X; zh-TW; rv:1.8.1.13)
Gecko/20080311 Firefox/2.0.0.13
Accept: text/javascript, text/html, application/xml, text/xml, */*
Accept-Language: zh-tw,en-us;q=0.7,en;q=0.3
Accept-Encoding: gzip,deflate
Accept-Charset: Big5,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300
Connection: keep-alive
X-Requested-With: XMLHttpRequest
X-Prototype-Version: 1.6.0.1

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

GET /users/1?format=xml

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

request.format = :xml

5)自定义格式

# config/initializers/mime_types.rb
Mime::Type.register ‘audio/mpeg’, :mp3?Mime::Type.register ‘audio/mpegurl’, :m3u

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

代码如下:

def show
@mp3 = Mp3.find(params[:id])
respond_to do |format|
format.html
format.mp3 { redirect_to @mp3.url }
format.m3u { render :text => @mp3.url }
end
end

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

先看一个文件名:

index.html.erb

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

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

<%= @event.name %>

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

OSDC 2008

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

文件名为:show.xml.builder

xml.instruct!
xml.title "This is a title"
xml.person do
xml.first_name "Ryan"
xml.last_name "Raaum"
end

渲染为:

<?xml version="1.0" encoding="UTF-8"?>
<title>This is a title</title>
<person>
<first_name>Ryan</first_name>
<last_name>Raaum</last_name>
</person>

再看看atom feed(一种rss)

index.atom.builder

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

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

在最后加入

respond_to do |format|
      format.html
      format.xml { render :xml => @events.to_xml }
      format.json { render :json => @events.to_json }
      format.atom { @feed_title = "My event list" } # index.atom.builder
    end

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

atom_feed do |feed|
  feed.title( @feed_title )
  feed.updated( @events.last.created_at )
  @events.each do |event|
    feed.entry(event) do |entry|
      entry.title( event.name )
      entry.content( event.description, :type => 'html' )
    end
  end
end

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

http://127.0.0.1:3000/events.xml

Ruby on Rails 之旅(七)—— Ruby on Rails 入门(5)

http://127.0.0.1:3000/events.json

Ruby on Rails 之旅(七)—— Ruby on Rails 入门(5)

http://127.0.0.1:3000/events.atom

Ruby on Rails 之旅(七)—— Ruby on Rails 入门(5)

是不是处理多格式不在繁琐了呢。

点赞
收藏
评论区
推荐文章
blmius blmius
2年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Jacquelyn38 Jacquelyn38
2年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Wesley13 Wesley13
2年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Stella981 Stella981
2年前
HIVE 时间操作函数
日期函数UNIX时间戳转日期函数: from\_unixtime语法:   from\_unixtime(bigint unixtime\, string format\)返回值: string说明: 转化UNIX时间戳(从19700101 00:00:00 UTC到指定时间的秒数)到当前时区的时间格式举例:hive   selec
Wesley13 Wesley13
2年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Stella981 Stella981
2年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Stella981 Stella981
2年前
Docker 部署SpringBoot项目不香吗?
  公众号改版后文章乱序推荐,希望你可以点击上方“Java进阶架构师”,点击右上角,将我们设为★“星标”!这样才不会错过每日进阶架构文章呀。  !(http://dingyue.ws.126.net/2020/0920/b00fbfc7j00qgy5xy002kd200qo00hsg00it00cj.jpg)  2
Wesley13 Wesley13
2年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
4个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这