【发布时间】:2012-03-02 13:08:06
【问题描述】:
我正在尝试在我的 Rails 应用中使用 Sinatra 应用作为中间件。
我在 Rails 应用程序的 /lib 文件夹中测试了一个基本的 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 的根路径?
【问题讨论】:
标签: ruby-on-rails sinatra rack rack-middleware