Sinatra 条件
路由也可以包含多样的匹配条件,比如 user agent(用户代理,比如浏览器就是一种用户代理):
get '/foo', :agent => /Songbird (\d\.\d)[\d\/]*?/ do
"你正在使用Songbird,版本是 #{params[:agent][0]}" # :agent 代表了用户代理相关的变量,版本的信息相当的全面
end
get '/foo' do
# 匹配除Songbird以外的浏览器
end
其他可选的条件是 host_name 和 provides:
get '/', :host_name => /^admin\./ do
"管理员区域,无权进入!" # host_name 表示的是主机用户的名字
end
get '/', :provides => 'html' do
haml :index
end
get '/', :provides => ['rss', 'atom', 'xml'] do
builder :feed
end
provides 查找请求的 Accpet 头部信息
你也可以使用set
方法自定义条件:
set(:probability) { |value| condition { rand <= value } }
get '/win_a_car', :probability => 0.1 do
"You won!"
end
get '/win_a_car' do
"Sorry, you lost."
end
如果某条件需要多个值作为输入,可以使用 通配符 参数 :
set(:auth) do |*roles| # <- notice the splat here
condition do
unless logged_in? && roles.any? {|role| current_user.in_role? role }
redirect "/login/", 303
end
end
end
get "/my/account/", :auth => [:user, :admin] do
"Your Account Details"
end
get "/only/admin/", :auth => :admin do
"Only admins are allowed here!"
end