我想尝试一个简单的 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下运行。
这是我的具体问题:
在此先多谢!
最佳答案
这应该执行您想要的操作:
# 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/