2011-01-27 7 views
5

シンプルなラックミドルウェア "hello world"を試してみたいが、私は立ち往生しているようだ。 メインsytaxが変更のようないくつかの例には、このコードを使用するので、それは、見えます:Hello Worldラックミドルウェア3:すべての要求のボディを処理する方法

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> 

でも、私はそれらを得るように見えることはできませんレール3.0.3で走るここ

は私の具体的な質問です:

  • は、どのように私はレールのアプリから任意の出力のボディを実行し、変更するためのシンプルなラックミドルウェアを得ることができますか?
  • 私はRails.application.config.middleware.use宣言をどこに置くべきですか? (私はそのための設定/初期化子で独自のイニシャライザを作成しました)

ありがとうございます!

# 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に)その上のほぼすべての他の要求は、これが原因別のミドルウェア(ラックに失敗します:

答えて

6

これは、あなたがにそれが欲しいものを行う必要があります。 :Head)は、コンテンツが変更されていないときに空の要求を送信するためです。この例ではresponse.bodyを呼び出すことができますが、実際には配列の最後のメンバーは.eachに応答するものになります。

ライアンベイツはかなりよくここラックの上に行く:

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

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

公式ガイドレールはかなり良いです:

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

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

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

6

Railsの3.2.12+

previous答えはRailsのために動作しません3.2.12+

この1つはありません:

# 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 
関連する問題