我想尝试一个简单的机架中间件“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运行它们。
这是我的具体问题:
提前多多感谢!
答案 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规范:
答案 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