2011-01-27 12 views
5

Chcę wypróbować proste oprogramowanie pośrednie typu "cześć świat", ale wydaje się, że utknąłem. wygląda główny sytax zmianie, ponieważ niektóre przykłady użyć tego kodu:Oprogramowanie pośredniczące Hello World rack z szynami 3: jak przetworzyć ciało wszystkich żądań

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 

generuje błąd:

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

nawet kiedy patrzę na innych kodów tam, nie wydaje się je bieganie z szynami 3.0.3.

tutaj są moje konkretne pytania:

  • w jaki sposób można uzyskać prosty rack middleware do uruchamiania i modyfikowania ciała dowolnego wyjścia z aplikacji Rails?
  • gdzie powinienem umieścić deklarację Rails.application.config.middleware.use? (Stworzyłem własny inicjator w konfiguracji/inicjalizatory)

dziękuję z dużym wyprzedzeniem!

Odpowiedz

6

ten powinien robić to, co chcesz go:

# 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 

Należy pamiętać, że na prawie każdy inny wniosek (przynajmniej on Rails 3.0.3), to nie powiedzie się z powodu innego oprogramowania pośredniczącego (Rack: : Head), ponieważ wysyła puste żądanie, gdy zawartość pozostaje niezmieniona. Jesteśmy w tym przykładzie, w zależności od możliwości wywołania response.body, ale tak naprawdę ostatnim elementem tablicy może być cokolwiek, co odpowiada na .each.

Ryan Bates podchodzi Rack całkiem dobrze tutaj:

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

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

i oficjalnych prowadnicami jest całkiem dobre: ​​

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

i oczywiście Oficjalna specyfikacja stojaka:

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

6

Szyny 3.2.12+:

previous odpowiedź nie działa dla Rails 3.2.12+

to się robi:

# 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