我想尝试一个简单的 Rack 中间件“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下运行。

这是我的具体问题:
  • 我如何获得一个简单的 Rack 中间件来运行和修改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://railscasts.com/episodes/151-rack-middleware

    官方的Rails指南也相当不错:

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

    当然还有官方的Rack规范:

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

    关于ruby-on-rails-3 - 带有Rails 3的Hello World Rack 中间件: how to process body of all requests,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4823170/

    10-13 09:34