# 最小 Rack 应用:任何响应 call(env) 的对象都是 Rack 应用
class HelloRack
def call(env)
# env 是包含请求信息的 Hash
path = env["PATH_INFO"]
method = env["REQUEST_METHOD"]
body = case path
when "/" then "首页"
when "/about" then "关于我们"
else "404"
end
# 返回 [状态码, 响应头, 响应体(可迭代)]
[200, { "Content-Type" => "text/plain; charset=utf-8" }, [body]]
end
end
# 用 Rack 内置服务器运行(ruby hello_rack.rb 后访问 localhost:9292)
require "rack"
Rack::Handler::WEBrick.run(HelloRack.new, Port: 9292)
Rack 中间件——洋葱模型:
# 中间件:包装应用的「层」
class TimerMiddleware
def initialize(app)
@app = app
end
def call(env)
start = Time.now
status, headers, body = @app.call(env) # 调用下一层
elapsed = Time.now - start
headers["X-Response-Time"] = "#{elapsed}s"
[status, headers, body]
end
end
# 使用
app = TimerMiddleware.new(HelloRack.new)
Rack::Handler::WEBrick.run(app, Port: 9292)
步骤 4:Sinatra——极简 Web 框架
# gem install sinatra puma
# app.rb
require "sinatra"
# 路由:HTTP 方法 + 路径
get "/" do
"Hello, Sinatra!"
end
get "/users/:id" do
"用户 ID: #{params[:id]}"
end
post "/users" do
content_type :json
{ name: params[:name], created: true }.to_json
end
# 过滤器:before/after
before do
@start_time = Time.now
end
after do
puts "请求耗时: #{Time.now - @start_time}s"
end
# 错误处理
not_found do
"页面不存在"
end
error do
"服务器错误: #{env['sinatra.error']}"
end
# 运行:ruby app.rb,访问 localhost:4567
步骤 5:Rails 生态速览
# 创建 Rails 应用(需要先 gem install rails)
rails new myapp --database=postgresql
cd myapp
rails server # 启动开发服务器
# 常用生成器
rails generate model User name:string email:string
rails generate controller Users index show
rails generate migration AddAgeToUsers age:integer
# 数据库
rails db:create
rails db:migrate
rails console # 进入 Rails console(类似 irb 但加载了应用)