我想尝试一个简单的机架中间件“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(使用前将#替换为@)