机架为其中间件提供了什么

时间:2013-12-23 21:04:10

标签: ruby rack

我在railscasts上看到了以下代码:

def each(&block)
    block.call("<!-- #{@message}: #{@stop - @start} -->\n") if @headers["Content-Type"].include? "text/html"
    @response.each(&block)
  end

我想知道&amp; block来自哪里?这里发生了什么?

2 个答案:

答案 0 :(得分:1)

&block是在Ruby中定义接受方法并将块显式分配给&引用的变量的方法的方法。

具体来说,该代码的作用是什么,它接受一个块,调用块传递一个字符串作为参数,然后将该块传递给内部响应。

乍一看,我会说你看到的特定中间件基本上是注入字符串

"<!-- #{@message}: #{@stop - @start} -->\n"
如果请求内容类型为"text/html",则

进入HTTP响应正文,这意味着HTTP页面。

如果请求是针对HTTP页面的,则会提供响应,并且会注入该字符串。否则,如果请求是针对另一种文件(例如二进制文件,文本文件,javascript等),则无需任何修改即可提供响应。

以下示例将帮助您更多地了解&block

的范围
def foo(&block)
  puts "foo"
  bar(&block)
end

def bar(&block)
  puts "bar"
  block.call
end

foo do
  puts "block"
end

# => foo
# => bar
# => block

另请注意,保存块的变量可以命名为任何内容,而不是block

def foo(&my_block)
  puts "foo"
  bar(&my_block)
end

def bar(&another_block)
  puts "bar"
  another_block.call
end

foo do
  puts "block"
end

# => foo
# => bar
# => block

答案 1 :(得分:0)

在给定的示例中each被定义为使中间件表现为有效的 rack 响应主体(我真的不建议这样做)。

Rack希望响应主体是一个类的实例,它将each定义为公共方法(数组或甚至 ActionController :: Response 实例)。

之后的任何中间件都可以使用each来操作响应主体。在中间件链末端机架本身将使用它来处理和发送最终响应。