URL使用机架安装映射整个命名空间?

时间:2014-01-30 10:06:32

标签: ruby sinatra rack

我有两个基于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 /”不是一个选项,我担心。

1 个答案:

答案 0 :(得分:2)

我的config.ru文件在测试时似乎运行正常,但看起来有点困惑。这是一个更简单的例子,可以实现同样的目标:

map "/projects" do
  run Project # note run, not use
end
run Core

现在,路径以/projects开头的任何请求都将路由到Project应用,而所有其他请求将转到Core,这会自动与根路径相关联。< / p>