6

シンプルなラックミドルウェア「helloworld」を試してみたいのですが、行き詰まってしまいそうです。一部の例では次のコードを使用しているため、メインの構文が変更されたように見えます。

require 'rack/utils'

class FooBar

  def initialize(app)
    @app = app
  end

  def call(env)
    status, headers, body = @app.call(env)
         body.body << "\nHi from #{self.class}"
         [status, headers, body]
  end
end

エラーが発生します:

undefined method `<<' for #<ActionDispatch::Response:0x103f07c48>

他のコードを見ても、Rails3.0.3で実行できるようには見えません。

ここに私の具体的な質問があります:

  • Railsアプリからの出力の本体を実行および変更するための単純なラックミドルウェアを取得するにはどうすればよいですか?
  • Rails.application.config.middleware.use宣言はどこに置くべきですか?(私はそのためにconfig / initializersに独自のイニシャライザーを作成しました)

よろしくお願いします!

4

2 に答える 2

6

Rails 3.2.12+ :

前の回答はRails 3.2.12+では機能しません

これは次のことを行います:

# in config/application.rb
config.middleware.use 'FooBar'

# in config/initializers/foo_bar.rb
class FooBar
  def initialize(app)
    @app = app
  end

  def call(env)
    status, headers, response = @app.call(env)
    response.body += "\nHi from #{self.class}"
    # response.body << "..." WILL NOT WORK
    [status, headers, response]
  end
end
于 2013-04-02T21:35:05.863 に答える
6

これはあなたが望むことをするはずです:

# in config/application.rb
config.middleware.use 'FooBar'

# in config/initializers/foo_bar.rb
class FooBar
  def initialize(app)
    @app = app
  end

  def call(env)
    status, headers, response = @app.call(env)
    [status, headers, response.body << "\nHi from #{self.class}"]
  end
end

ほぼすべての他のリクエスト (少なくとも Rails 3.0.3 では) では、別のミドルウェア (Rack::Head) が原因で失敗することに注意してください。これは、コンテンツが変更されていない場合に空のリクエストを送信するためです。この例では、response.body を呼び出すことができるかどうかに依存していますが、実際には、配列の最後のメンバーは、.each に応答するものであれば何でもかまいません。

Ryan Bates は、ここで Rack をうまく使いこなしています。

http://asciicasts.com/episodes/151-rack-middleware

http://railscasts.com/episodes/151-rack-middleware

また、公式の Rails ガイドも非常に優れています。

http://guides.rubyonrails.org/rails_on_rack.html

そしてもちろん、公式のラック仕様:

http://rack.rubyforge.org/doc/SPEC.html

于 2011-04-06T02:08:18.860 に答える