【问题标题】:URL Map an entire namespace using rack mount?URL 使用机架安装映射整个命名空间?
【发布时间】:2014-01-30 10:06:32
【问题描述】:

我有两个基于模块化 Sinatra 机架的应用程序:core.rbproject.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 类处理。我发现您可以通过 2 种方式在有限的范围内做到这一点:

# 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 时会抛出一个错误,指出它在我的主core.rb 文件中找不到/foo 路线 - 这是NOT 我想要的。换句话说,它在错误的文件中寻找我的/foo 路由:(

那么,是否可以使用机架安装映射整个 /projects 命名空间?不,在project.rb 的所有路线中添加“/projects/”恐怕不是一个选项。

【问题讨论】:

    标签: ruby sinatra rack


    【解决方案1】:

    您的config.ru 文件在我测试时似乎可以正常工作,但看起来有点混乱。下面是一个实现相同目的的更简单示例:

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

    现在任何以/projects 开头的请求都将被路由到Project 应用程序,所有其他请求都将转到Core,它会自动与根路径关联。

    【讨论】:

    • 啊,没有发布解决方案就是这么简单。那么runuse 有什么区别呢?是的,使用run 最终完美运行,谢谢。
    猜你喜欢
    • 2011-02-01
    • 1970-01-01
    • 2013-12-06
    • 1970-01-01
    • 2017-04-23
    • 2012-03-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多