我有两个基于Sinatra机架的模块化应用程序:core.rb
& project.rb
:
# core.rb
class Core < Sinatra::Base
get "/" do
"Hello, world!"
end
end
# project.rb
class Project < Sinatra::Base
get "/" do
"A snazzy little Sinatra project I wish to showcase."
end
get "/foo" do
"If you see this, congratulations."
end
end
我的目标只是将整个/projects
命名空间映射到Project
类,而其他所有内容都由Core
类处理。我发现你可以通过两种方式在有限的范围内做到这一点:
# config.ru
require "./core.rb"
require "./projects.rb"
map "/projects" do
# Method #1: Using Sinatra's built-in Middleware
use Project
# Method #2: Using Rack::Cascade
run Rack::Cascade.new( [Project, Core] )
end
run Core
我在上面尝试的两种方法都有相同的效果。路由/
和/projects
正确显示,但是当转到/projects/foo
时,它会抛出一个错误,指出它无法在我的主{{1}中找到/foo
路由文件 - 这是不我想要的。换句话说,它正在错误的文件中寻找我的core.rb
路线:(
那么,是否可以使用机架式映射整个/foo
命名空间?不,在/projects
中为我的所有路线添加“/ projects /”不是一个选项,我担心。
答案 0 :(得分:2)
我的config.ru
文件在测试时似乎运行正常,但看起来有点困惑。这是一个更简单的例子,可以实现同样的目标:
map "/projects" do
run Project # note run, not use
end
run Core
现在,路径以/projects
开头的任何请求都将路由到Project
应用,而所有其他请求将转到Core
,这会自动与根路径相关联。< / p>