Rails アプリで Sinatra アプリをミドルウェアとして使用しようとしています。
/lib
Railsアプリのフォルダーで基本的なSinatraアプリをテストしuse
、ミドルウェアをdし、ルートを設定しました。それはうまくいきました。
私ができるようにしたいのは、Sinatra アプリを抽出し、gem として含めることです。そうすれば、Sinatra アプリを個別に実行したり、複数の Rails アプリで使用したりできます。
シナトラアプリ
# 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 のルート パスをハイジャックしないようにするにはどうすればよいですか?