【问题标题】:Sinatra app as Rails 3 subpathSinatra 应用程序作为 Rails 3 子路径
【发布时间】:2023-11-11 08:43:01
【问题描述】:

我正在尝试将 sinatra 应用程序作为我的 rails 3 应用程序中的子路径。 具体来说,resque 排队系统有一个基于 sinatra 的 Web 界面,我希望可以通过我常用的 rails 应用程序上的 /resque 访问它。

您可以在此处查看该项目:http://github.com/defunkt/resque

我发现有些人在谈论添加机架文件并做这种事情:

run Rack::URLMap.new( \
  "/" => ActionController::Dispatcher.new,
  "/resque" => Resque::Server.new
)

但我真的不知道把它放在哪里或如何让它运行。我的部署是与乘客一起进行的,但如果我也运行“rails server”时也让它运行我会很高兴。有什么建议吗?

--编辑--

通过将以下内容放入 config/routes.rb,我取得了一些进展:

match '/resque(/:page)', :to => Rack::URLMap.new("/resque" => Resque::Server.new)

这似乎工作得很好,但是它丢失了公共文件夹(我猜是在 gem 中定义的),因此没有样式信息,也没有图像。

【问题讨论】:

    标签: ruby-on-rails sinatra ruby-on-rails-3 rack middleware


    【解决方案1】:

    您可以将任何机架端点设置为 rails 3 中的路线。wycats 的本指南介绍了您正在寻找的内容以及您可以在 rails3 中执行的许多其他操作:

    http://yehudakatz.com/2009/12/26/the-rails-3-router-rack-it-up/

    例如:

    class HomeApp < Sinatra::Base
      get "/" do
        "Hello World!"
      end
    end
    
    Basecamp::Application.routes do
      match "/home", :to => HomeApp
    end
    

    【讨论】:

    • 谢谢!这就是我一直在寻找的。但是 URL 不映射到根目录。 IE。传递给 HomeApp 的所有 url 都以“/home”开头。有没有办法重新映射它们?
    • 只需将match "/home" 替换为match "/"?
    • 这会将所有路线映射到 sinatra 应用程序。我希望 /resque/home 在 sinatra 应用程序中调用 /home。我能想到的唯一解决方案是弄乱 Rack 环境并剥离路径。
    • 好的,我尝试重写 env['PATH_INFO'] 并且它破坏了所有重定向等,所以这可能行不通。
    • @zaius 也许这会有所帮助*.com/questions/3026200/…
    【解决方案2】:

    Yehuda (/Scott S) 的解决方案不适用于 Rails 3.0.4 和 Sinatra 1.2.1...在匹配器中设置 :anchor =&gt; false 是关键:

    # in routes.rb
    match "/blog" => MySinatraBlogApp, :anchor => false
    
    # Sinatra app
    class MySinatraBlogApp < Sinatra::Base
      # this now will match /blog/archives
      get "/archives" do
        "my old posts"
      end
    end
    

    (回答 c/o Michael Raidel - http://inductor.induktiv.at/blog/2010/05/23/mount-rack-apps-in-rails-3/

    【讨论】:

      最近更新 更多