Sinatra机架中间件劫持’/’根url
我正在尝试在我的Rails应用程序中使用Sinatra应用程序作为中间件。
我在Rails应用程序的/lib
文件夹中测试了一个基本的Sinatra应用程序, use
d中间件并设置路由。 这工作得很好。
我想要做的是提取Sinatra应用程序并将其作为gem包含在内。 这样我就可以独立运行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 # 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
的根路径。
当我直接在我的Rails应用程序中包含Sinatra应用程序时,访问http://myapp.dev
呈现正确的pages#show
action。
我该怎么做才能让Sinatra应用程序不劫持Rails的根本路径?
您实际上不需要将Sinatra应用程序作为中间件包含在您想要的内容中。
将其作为中间件包括在内意味着所有请求都通过它进行路由,您不需要/不需要它来提供路由。
如果要在rails应用程序中包含gem时自动添加路由,则可以添加一个将路由添加到应用程序的railstie。 我不记得我的头脑是什么样子,但它应该非常简单。