1.什么是rack
app = lambda do |env|
body = "Hello, World!"
[200, {"Content-Type" => "text/plain", "Content-Length" => body.length.to_s}, [body]]
end
run app重点是第三行,一个基于rack的ruby应用只需要一个包含call方法的对象,在调用call方法后该对象会返回形如第三行的一个列表,该列表包含三个元素:第一个元素是这次http请求的返回状态码200,第二个元素是一个返回的http响应headers的hash表,第三个元素是http响应体的列表,所以该列表的形式为:
2.一个简单的rack-based-application
run lambda { |env| [200,{'Content-Type'=>'text/plain'},['OK']]}That's all.这个基于rack的应用已经编写完成了,在terminal中键入下面命令即可启动这个应用了:
rackup rack_based/simple.rurack使用默认的内置WEBrick服务器,用rackup命令在端口9292启动该应用:
JasondeMacBook-Pro:Projects jason$ rackup rack_based/simple.ru
Thin web server (v1.6.1 codename Death Proof)
Maximum connections set to 1024
Listening on 0.0.0.0:9292, CTRL+C to stop在浏览器中访问http://localhost:9292即可看到页面显示“OK”,说明应用正常工作了。
# This file is used by Rack-based servers to start the application.
require ::File.expand_path('../config/environment', __FILE__)
run Rails.application
所以,Rails.application也能响应call方法。
module Simple
class Application
def self.call(env)
[200,{'Content-Type'=>'text/plain'},[env.to_s]]
end
end
end
run Simple::Application启动该应用,则可以看到结果:
3.middleware
rake middlewareuse Rack::Sendfile
use ActionDispatch::Static
......
use Rack::Head
use Rack::ConditionalGet
use Rack::ETag
run Demo::Application.routes
require 'nokogiri'
class LinkJumbler
def initialize(app,letters)
@app=app
@letters=letters
end
def call(env)
status, headers, response = @app.call(env)
body=Nokogiri::HTML(response.body)
body.css("h1").each do |a|
@letters.each do |f,r|
a.content=a.content.gsub f.to_s,r.to_s
end
end
[status,headers,[body.to_s]]
end
end首先,在initialize方法中,接受了两个参数,一个是app参数,它会在各个middleware中传递,需要对它调用call方法。另一个参数letters是我们这个middleware需要的参数,这个参数来源是挂载middleware时产生的。不同middleware的传递的这个参数不同,也可能根本没有这个额外的参数。在call方法中,先对@app调用了call方法获得了一个rack风格的响应结果,这里利用nokogiri解析结果,并做出修改,最后返回结果。在java struts中有个前拦截器和后拦截器,从这里也可以看出middleware也可以有相同的功能,比如这里就是对结果作处理,属于一个后处理的middleware。
require File.expand_path('../boot', __FILE__)
require 'rails/all'
require File.expand_path('../../lib/link_jumbler', __FILE__)
Bundler.require(:default, Rails.env)
module Demo
class Application < Rails::Application
config.middleware.use LinkJumbler,{"e"=>"X"}
end
end
再次执行rake middleware命令,可以看到LinkJumbler被添加到最后一层middleware:
use ActionDispatch::Static
......
use Rack::Head
use Rack::ConditionalGet
use Rack::ETag
use LinkJumbler
run Demo::Application.routes
839



被折叠的 条评论
为什么被折叠?



