# 3.4.5 Ruby
### 3.4.5 Ruby
Ruby也是一门通用编程语言,由松本行弘(Yukihiro Matsumoto)发明,并在1996年达到了1.0版。它的主要特征包括开放类定义(open class)、混合器(mixin)和code block等。
对于Ruby语言的学习,我推荐OReilly出版的[《The Ruby Programming Language》](http://shop.oreilly.com/product/9780596516178.do),其作者之一正是松本行弘。
Ruby在服务器端的编程基于Rack,它是Ruby的一个规范,定义了服务器跟应用程序交互的接口,跟Python的WSGI类似。同样地,这里“服务器”是指接受客户端(如浏览器)HTTP请求的程序,而“应用程序”是指(由你编写的)响应HTTP请求的程序。Ruby所有的Web编程框架都基于Rack,包括Rails在内。因此了解、掌握它十分必要[1](#fn_1)。
一个Rack的“Hello,world”程序如下:
```
require 'rack'
app = proc do |env|
['200', {'Content-Type' => 'text/html'}, ['<p>Hello, Rack!</p>']]
end
Rack::Handler::WEBrick.run(app, :Port => 8090, :Host => '0.0.0.0')
```
其中,app就是我们的Rack应用程序。按照Rack规范:
- Rack应用程序可以是任何具有“call”方法的对象。在这里它是一个proc。
- 它带有一个参数,env,包含了与CGI环境变量类似的输入。
- 它返回一个数组,包含三个元素,分别是HTTP状态代码,应答头(response header)以及消息主体(message body)。
要运行这个程序首先要安装rack(一个Ruby Gem,包含用于构建Rack程序的辅助工具,相当于Python的wsgiref包):
```
gem install rack
```
然后在命令行执行(假设程序保存在文件hello.rb中):
```
ruby hello.rb
```
在浏览器中访问`http://localhost:8090/`,即可看到结果。
与Python WSGI相同,Rack也支持**中间件(middleware)**。一个简单的例子如下(包含三个文件,文件名在首行注释):
```
# app.rb
class App
def call(env)
['200', {'Content-Type' => 'text/html'}, ['<p>Hello, Rack!</p>']]
end
end
```
```
# middleware.rb
class Middleware
def initialize(app)
@app = app
end
def call(env)
status, headers, body = @app.call(env)
body.each {|line| line.upcase! }
return [status, headers, body]
end
end
```
```
# config.ru
require './app'
require './middleware'
use Middleware
run App.new
```
我们已经说过“Rack应用程序可以是任何具有“call”方法的对象”。在这个例子中,它是一个App类的对象。
中间件也是一个Rack应用程序,但是它“含有”另一个Rack应用程序。Rack服务器调用中间件,传递给它一个env参数,并接受它返回的状态代码、应答头部和消息主体。这样,中间件可以检查、修改env,并把它传递给“内含”的Rack应用程序。它还可以检查、修改内含的Rack应用程序的返回结果,并返回给上级服务器(也可能是另一个中间件!)。在这个例子中,我们把内部App返回的消息主体字符都转化成大写。
虽然简单,但这是一个产品级的配置:我们使用了config.ru来组装我们的Rack应用程序和中间件。config.ru是Rack应用程序的标准配置:它指定了Rack应用程序(通过`run`)及中间件(通过`use`),把它们组装在一起,形成了一个完整的Rack应用。
要运行这个应用程序,在命令行上执行:
```
rackup -p 8090 -o 0.0.0.0
```
然后就可以在浏览器中通过`http://localhost:8090/`访问它。
关于Rack的更多信息,可参考:<https://github.com/rack/rack>。
关于Ruby的Web编程框架,除了著名的[Ruby on Rails](http://rubyonrails.org/),还有[Sinatra](http://www.sinatrarb.com/)(一个小型轻量级框架)等,它们都基于Rack。
> 1. 限于篇幅,这里对Rack只做了简单的介绍。若想进一步了解Rack,请看我的博文[Ruby Rack及其应用(上)](http://huiming.io/2016/11/10/ruby-rack.html)。[↩](#reffn_1 "Jump back to footnote [1] in the text.")
- 前言
- 1 Web概述
- 1.1 什么是Web
- 1.2 超文本和超链接
- 1.3 URL
- 1.4 DNS
- 1.5 HTTP
- 1.5.1 客户端请求
- 1.5.2 服务器应答
- 1.5.3 进一步了解HTTP
- 1.6 HTTPS
- 2 Web浏览器
- 2.1 HTML
- 2.1.1 文档类型声明
- 2.1.2 标签和属性
- 2.1.3 文档结构
- 2.1.4 DOM
- 2.1.5 进一步了解HTML
- 2.2 CSS
- 2.2.1 样式与样式表
- 2.2.2 样式表语法
- 2.2.3 级联样式表
- 2.2.4 进一步了解CSS
- 2.3 JavaScript
- 2.3.1 script标签
- 2.3.2 操纵DOM
- 2.3.3 jQuery
- 2.3.4 进一步了解JavaScript
- 2.4 Ajax
- 2.5 移动设备与响应式Web设计
- 3 Web服务器
- 3.1 方法与资源
- 3.2 状态代码
- 3.3 静态内容与动态内容
- 3.4 编程语言与技术
- 3.4.1 CGI
- 3.4.2 PHP
- 3.4.3 Java
- 3.4.4 Python
- 3.4.5 Ruby
- 3.4.6 Node.js
- 3.5 RESTful Web API
- 3.6 服务器架构
- 3.7 Web缓存
- 3.8 服务器推送
- 4 数据库
- 4.1 关系型数据库
- 4.2 NoSQL数据库
- 5 Web服务器的其他组件
- 5.1 Cron
- 5.2 消息队列
- 5.3 邮件服务器
- 6 开发工具与技术
- 6.1 Git
- 6.1.1 Git基础操作
- 6.1.2 Git基本原理
- 6.1.3 进一步了解Git
- 6.2 敏捷开发