了解下Rack/MiddleWare/Rails/Metal
POSTED AT: 2009-11-28 01:55:02 UTC |
POSTED IN: Ruby/Rails |
3 COMMENTS
忙里偷闲,想看下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。
啊啊啊!!!我不写了,看那个视频吧。。。
以后看一下这段代码,就能記起相关概念了
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
本文基于 署名-非商业性使用-禁止演绎 2.5 中国大陆 发布
3 COMMENTS >>LEAVE<<
-
看着看着想起以前学j2ee的时候了,呃。。。
-
@wayne
j2ee怎能与rails相比,哈哈,rails太优质了
-
rails没有用过,不了解