0

Rails アプリで Sinatra アプリをミドルウェアとして使用しようとしています。

/libRailsアプリのフォルダーで基本的な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 のルート パスをハイジャックしないようにするにはどうすればよいですか?

4

1 に答える 1

1

やりたいことをするために、Sinatra アプリをミドルウェアとして実際に含める必要はありません。

それをミドルウェアとして含めることは、すべてのリクエストがそれを介してルーティングされることを意味します。これは、ルートを提供するためには必要ありません。

Rails アプリに gem を含めるときにルートを自動的に追加したい場合は、アプリケーションにルートを追加する railtie を追加できます。頭のてっぺんからそれがどのように見えるかは思い出せませんが、かなり簡単なはずです。

于 2012-03-02T14:52:29.317 に答える