了解下Rack/MiddleWare/Rails/Metal

忙里偷闲,想看下rails相关的代码,不知何处开始。就先了解一点当下比较火的metal。做下小记录,估计以后很长时间不会再看,以免遗忘。大部分内容来源于这个万恶的资本主义制造的视频

先从Rack开始,Rack的目标很简单

Rack在支持Ruby的WEB服务器和Ruby框架之间提供了一个最精简的interface

一个基于Rack的app其实就是一个Ruby对象,这个对象唯一的要求就是满足这两条spec

1、能够响应call方法,并且接受env参数
2、返回一个数组[status, header, body]

来看一个最简单的Hello world,这里的对象是一个lambda

require 'rubygems'
require 'rack'
lambda_app = lambda { |env| 
  [200, {"Content-Type" => "text/html"}, "Hello World !"] 
}

Rack::Handler::Mongrel.run lambda_app, :Port => 3000

运行这段代码,然后打开你的浏览器,访问http://localhost:3000,看看吧,一个最简单的web程序就誕生了

再来领会下rack中middleware的概念,看名字其实也很容易理解,就是介于中间的一个ware。
rack-middleware-pic

啊啊啊!!!我不写了,看那个视频吧。。。

以后看一下这段代码,就能記起相关概念了

require 'rubygems'
require 'rack'

#一个标准的middleware就是按照这个模式,首先初始化一个Rack app,
#然后在自己的call方法中处理請求返回的status, header和body
class ClassRack
  def initialize(app)
    @app = app
  end

  def call(env)
    status, header, body = @app.call(env)
    [status, header, body << " -- ClassRack"]
  end
end

lambda_app = lambda { |env| 
  [200, {"Content-Type" => "text/html"}, "This is a LambdaRack"] 
}

#Rack builder的用法
builder = Rack::Builder.new do
  #这里使用了一个middleware,用来提供log功能
  use Rack::CommonLogger 

  #http://localhost:3000/
  map '/' do 
    run lambda_app
  end

  map '/class' do 
    #http://localhost:3000/class/
    map '/' do 	    
      run ClassRack.new(lambda_app)
    end
    
    #http://localhost:3000/class/lambda/
    map '/lambda' do       
      run Proc.new { |env| [200, {}, "lambda in nest map"] }
    end
  end
end

Rack::Handler::Mongrel.run builder, :Port => 3000

貌似还没写metal?运行下面的命令就明白了

ruby script/generate metal hello

下面是更好的介绍
http://m.onkey.org/2008/11/17/ruby-on-rack-1
http://m.onkey.org/2008/11/18/ruby-on-rack-2-rack-builder

TAGS:Rails,Ruby

3 COMMENTS >>LEAVE<<

  1. wayne

    看着看着想起以前学j2ee的时候了,呃。。。

  2. ABitNo
    @wayne

    j2ee怎能与rails相比,哈哈,rails太优质了

  3. 光卫

    rails没有用过,不了解

LEAVE A RESPONSE >>CANCEL<<

loader