32

私が探している機能はrake middleware、一般的なラックアプリケーションを除いて、Railsのコマンドに似ています。

4

5 に答える 5

42
$ rake middleware

use ActionDispatch::Static
use Rack::Lock
use #<ActiveSupport::Cache::Strategy::LocalCache::Middleware:0x007ffd148f9468>
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::Migration::CheckPending
use ActiveRecord::ConnectionAdapters::ConnectionManagement
use ActiveRecord::QueryCache
use ActionDispatch::Cookies
use ActionDispatch::Session::CookieStore
use ActionDispatch::Flash
use ActionDispatch::ParamsParser
use Rack::Head
use Rack::ConditionalGet
use Rack::ETag
run RackTest::Application.routes

http://pothibo.com/2013/11/ruby-on-rails-inside-actiondispatch-and-rack/

于 2013-12-21T00:23:02.930 に答える
20

これにより、ラックアプリケーションのすべてのミドルウェアのリストが返されます。

def middleware_classes(app)
  app.instance_variable_get(:@use).map{|middleware| middleware.call.class.name }
end

app = Rack::Builder.parse_file('config.ru').first; nil # trailing nil to avoid paging in an interactive console
p middleware_classes(app)
于 2012-07-31T15:04:23.143 に答える
1

拡張するSinatraアプリを使用している場合はSinatra::Base、MichaelHaleの回答を少し変更したバージョンを使用する必要がありました。

require 'rack'
​
def middleware_classes(app)
  r = [app]
  ​
  while ((next_app = r.last.instance_variable_get(:@app)) != nil)
    r << next_app
  end
  ​
  r.map{|e| e.instance_variable_defined?(:@app) ? e.class : e }
end
​
sinatra_app = Rack::Builder.parse_file('config.ru').first
sinatra_rack_builder = sinatra_app.build(sinatra_app)
sinatra_extended_app = sinatra_rack_builder.to_app
rack_app = sinatra_extended_app.app

pp middleware_classes(rack_app)

これをファイルに入れた後dump_middleware.rb、期待どおりにミドルウェアを見ることができました:

$ bundle exec ruby ./dump_middleware.rb
[Rack::Head,
 Rack::NullLogger,
 Rack::Session::Cookie,
 Rack::Protection::FrameOptions,
 Rack::Protection::HttpOrigin,
 Rack::Protection::IPSpoofing,
 Rack::Protection::JsonCsrf,
 Rack::Protection::PathTraversal,
 Rack::Protection::RemoteToken,
 Rack::Protection::SessionHijacking,
 Rack::Protection::XSSHeader,
 Warden::Manager,
 SinatraApp]

これを行うためのよりクリーンな方法があるかもしれません。

于 2020-02-28T12:56:47.850 に答える
0

コンスタンチン・ハーゼのラックグラフの宝石を試してみてください。

何らかの理由で、Konstantinはこのgemをrubygemsに公開するのに適していないと考えているため、gitを使用してGemfileに追加するか、ローカルにインストールして参照する必要があります。

# Gemfile
gem 'rack-graph', github: 'rkh/rack-graph'

$ bundle exec rackup -s Graph
# Locally (without bundler/Gemfile):
$ git clone https://github.com/rkh/rack-graph.git
$ ruby -I/path/to/rack-graph/lib $(which rackup) -s Graph

次のラックアプリケーションの例を考えます。

# config.ru
Foo = proc { [200, {}, ['Foo']] }
App = proc { [200, {}, ['Ok']] }

map '/foo' do
  use Rack::Runtime
  use Rack::MethodOverride
  run Foo
end

run App

これは出力です:

# Output:
Rack::ContentLength
 |- Rack::CommonLogger(stderr)
    |- Rack::ShowExceptions
       |- Rack::Lint
          |- Rack::TempfileReaper
             |- Rack::URLMap
                |- "/foo"
                |  |- Rack::Runtime
                |     |- Rack::MethodOverride
                |        |- Proc(0x00007fd93a97c2d0 /Users/steve/ruby/config.ru:1)
                |
                |- ""
                   |- Proc(0x00007fd93a97c2a8 /Users/steve/ruby/config.ru:2)
于 2020-10-11T01:48:09.787 に答える
-3

これは長い間遅れています、私は知っています

ここに素敵なスレッドがあります、決定的な答えは最後の投稿です

Marc-Andreのコメントに従って更新:

以下は、このリンクからの最後の投稿です

Rackにはそのためのメカニズムがなく、すべてのミドルウェアが@middlewareを介して追加されるわけではないため、Sinatraはどのミドルウェアが使用されているかを通知できません。レールもできません、ところで、それはあなたに何が可能かを伝えることができます。ミドルウェアは線形リストである必要はありません(つまり、ラックルーターなどを使用する場合)。

于 2011-08-27T14:09:22.240 に答える