带有rails 3的Hello World机架中间件:如何处理所有请求的主体

时间:2011-01-27 23:25:43

标签: ruby-on-rails-3 rack middleware rack-middleware

我想尝试一个简单的机架中间件“hello world”,但我似乎陷入困境。 看起来主要的sytax发生了变化,因为有些例子使用了这段代码:

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>

即使我在那里查看其他代码,我也似乎无法使用rails 3.0.3运行它们。

这是我的具体问题:

  • 我怎样才能获得一个简单的机架中间件来运行和修改rails应用程序的任何输出的主体?
  • 我应该把Rails.application.config.middleware.use声明放在哪里? (我在配置/初始化程序中创建了一个自己的初始化程序)

提前多多感谢!

2 个答案:

答案 0 :(得分: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

当然官方Rack规范:

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

答案 1 :(得分:6)

Rails 3.2.12 +

previous回答不适用于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