Hello World 机架中间件与 Rails 3:如何处理所有请求的正文

2024-02-15

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

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 声明放在哪里? (我为此在 config/initializers 中创建了一个自己的初始化程序)

预先非常感谢!


这应该做你想做的事:

# 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://asciicasts.com/episodes/151-rack-middleware

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

Rails 官方指南也非常好:

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

当然还有官方机架规格:

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Hello World 机架中间件与 Rails 3:如何处理所有请求的正文 的相关文章

随机推荐