0

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

我已经/lib在 Rails 应用程序的文件夹中测试了一个基本的 Sinatra 应用程序,used 中间件并设置了路由。那工作得很好。

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

Sinatra 应用程序

# 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 应用程序

# 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/rackroute路径 - 再次,正确的行为

问题

当我进入http://myapp.dev浏览器时,我会被定向到Myrackapp的根路径。

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

我该怎么做才能让 Sinatra 应用程序不劫持 Rails 的根路径?

4

1 回答 1

1

您实际上不需要包含 Sinatra 应用程序作为中间件来执行您想要的操作。

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

如果您想在将 gem 包含在 rails 应用程序中时自动添加路由,您可以添加一个 railtie 来将路由添加到应用程序。我不记得那是什么样子了,但它应该很简单。

于 2012-03-02T14:52:29.317 回答