Sinatra机架中间件劫持'/'根网址

时间:2012-03-02 13:08:06

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

我正在尝试在我的Rails应用程序中使用Sinatra应用程序作为中间件。

我在Rails应用程序的/lib文件夹中测试了一个基本的Sinatra应用程序,use d中间件并设置了一个路径。这很好。

我想要做的是提取Sinatra应用程序并将其作为宝石包含在内。这样我就可以独立运行Sinatra应用程序,或者在多个Rails应用程序中使用它。

Sinatra App

# myrackapp/lib/myrackapp.rb
module Myrackapp
  class Application < Sinatra::Base

    set :root, File.dirname(__FILE__)

    get "/" do
      "Rack Home"
    end

    get '/rackroute' do
      "Hello, Rack Page"
    end

    end
end

Myrackapp也有一个gemspec - 没有什么有趣的,但我可以在必要时发布。

Rails App

# Gemfile
gem 'myrackapp', path: "/Users/gareth/Code/myrackapp"

-

# config/application.rb
module Myrailsapp
  class Application < Rails::Application
    ...
    config.middleware.use "Myrackapp::Application"
  end
end

-

# config.routes.rb
root :to => 'pages#show', :id => 'home'
mount Myrackapp::Application => "/rackapp"

这是我的rake middleware输出:

    rake middleware
    use ActionDispatch::Static
    use Rack::Lock
    use #<ActiveSupport::Cache::Strategy::LocalCache::Middleware:0x141ded4>
    use Rack::Runtime
    use Rack::MethodOverride
    use ActionDispatch::RequestId
    use Rails::Rack::Logger
    use ActionDispatch::ShowExceptions
    use ActionDispatch::DebugExceptions
    use ActionDispatch::RemoteIp
    use ActionDispatch::Reloader
    use ActionDispatch::Callbacks
    use ActiveRecord::ConnectionAdapters::ConnectionManagement
    use ActiveRecord::QueryCache
    use ActionDispatch::Cookies
    use ActionDispatch::Session::CookieStore
    use ActionDispatch::Flash
    use ActionDispatch::ParamsParser
    use ActionDispatch::Head
    use Rack::ConditionalGet
    use Rack::ETag
    use ActionDispatch::BestStandardsSupport
    use Myrackapp::Application
    run Myrailsapp::Application.routes

当我转到http://myapp.dev/rackapp时,我得到Myrackapp的根路径 - 正确行为

当我转到http://myapp.dev/rackapp/rackroute时,我得到Myrackapp的{​​{1}}路径 - 再次,正确行为

问题

当我在浏览器中转到/rackroute时,我会转到http://myapp.dev的根路径。

当我将Sinatra应用程序直接包含在我的Rails应用程序中时,访问Myrackapp呈现了正确的http://myapp.dev操作。

如何让Sinatra应用程序不劫持Rails的根本路径?

1 个答案:

答案 0 :(得分:1)

您实际上并不需要将Sinatra应用程序作为中间件包含在您想要的内容中。

将其作为中间件包含将意味着所有请求都通过它进行路由,您不需要/不需要它来提供路由。

如果您想在rails应用程序中包含gem时自动添加路由,您可以添加一个为应用程序添加路由的铁路。我不记得我的头脑是什么样子,但它应该非常简单。