codecamp

Sinatra 路由 (route)

在 Sinatra 中,一个路由分为两部分:HTTP 方法 (GET, POST 等) 和 URL 匹配范式 (pattern)。每个路由都有一个要执行的代码块:

get '/' do
  .. 显示内容 ..
end

post '/' do
  .. 创建内容 ..
end

put '/' do
  .. 更新内容 ..
end

delete '/' do
  .. 删除内容 ..
end

options '/' do
  .. 显示命令列表 ..
end

link '/' do
  .. 建立某种联系 ..
end

unlink '/' do
  .. 解除某种联系 ..
end

路由按照它们被定义的顺序进行匹配,这一点和 Rails 中的 routes 文件的定义类似。第一个与请求匹配的路由会被调用。

路由范式 (pattern) 可以包括具名参数,参数的值可通过​params['name']​哈希表获得:

get '/hello/:name' do
  # 匹配 "GET /hello/foo" 和 "GET /hello/bar"
  # params[:name] 的值是 'foo' 或者 'bar'
  "Hello #{params[:name]}!"
end

也可以通过代码块参数获得具名参数:

get '/hello/:name' do |n|
  # 匹配"GET /hello/foo" 和 "GET /hello/bar"
  # params[:name] 的值是 'foo' 或者 'bar'
  # n 中存储了 params['name']
  "Hello #{n}!"
end

路由范式 (pattern) 也可以包含通配符参数 (splat parameter),可以通过​params[:splat]​数组获得。

get '/say/*/to/*' do
  # 匹配 /say/hello/to/world
  params[:splat] # => ["hello", "world"]
end

get '/download/*.*' do
  # 匹配 /download/path/to/file.xml
  params[:splat] # => ["path/to/file", "xml"]
end

通过正则表达式匹配的路由:

get %r{/hello/([\w]+)} do
  "Hello, #{params[:captures].first}!"
end

%r{}​表示字符串是正则表达式,这里需要注意的就是,将正则表达式匹配的变量捕获到​params['captures']​中了。

或者使用块参数:

get %r{/hello/([\w]+)} do |c|
  "Hello, #{c}!"
end

路由范式也可包含可选的参数:

get '/posts.?:format?' do
  # matches "GET /posts" and any extension "GET /posts.json", "GET /posts.xml" etc.
  # 匹配 "GET /posts" 以及带任何扩展名的  "GET /posts.json" , "GET /posts.xml" 等
end

路由也可使用查询参数:

get '/posts' do
  # matches "GET /posts?title=foo&author=bar"
  # 匹配  "GET /posts?title=foo&author=bar"
  title = params['title']
  author = params['author']
  # 使用title和 author 变量,对于 /posts 路由,查询参数是可选的
end

By the way, unless you disable the path traversal attack protection (see below), the request path might be modified before matching against your routes.

顺便说一下,除非想要禁用 路径遍历攻击保护 (path traversal attack protection) , 请求路径可在匹配路由之前修改。


Sinatra 简介
Sinatra 条件
温馨提示
下载编程狮App,免费阅读超1000+编程语言教程
取消
确定
目录

Sinatra 配置

Sinatra 错误处理

Sinatra Sinatra::Base - 中间件,程序库和模块化应用

关闭

MIP.setData({ 'pageTheme' : getCookie('pageTheme') || {'day':true, 'night':false}, 'pageFontSize' : getCookie('pageFontSize') || 20 }); MIP.watch('pageTheme', function(newValue){ setCookie('pageTheme', JSON.stringify(newValue)) }); MIP.watch('pageFontSize', function(newValue){ setCookie('pageFontSize', newValue) }); function setCookie(name, value){ var days = 1; var exp = new Date(); exp.setTime(exp.getTime() + days*24*60*60*1000); document.cookie = name + '=' + value + ';expires=' + exp.toUTCString(); } function getCookie(name){ var reg = new RegExp('(^| )' + name + '=([^;]*)(;|$)'); return document.cookie.match(reg) ? JSON.parse(document.cookie.match(reg)[2]) : null; }