机架错误“Rack :: Lint :: LintError:响应主体必须响应每个”

时间:2011-10-09 02:46:07

标签: ruby-on-rails ruby rack

我正在阅读tekpub机架教程但是当我尝试在机架中运行一个基本程序时,我得到了这个错误。

ERROR Rack::Lint::LintError: Response body must respond to each
/Users/adam/.rvm/gems/ruby-1.9.3-preview1/gems/rack-1.3.4/lib/rack/lint.rb:19:in     `assert'
/Users/adam/.rvm/gems/ruby-1.9.3-preview1/gems/rack-1.3.4/lib/rack/lint.rb:513:in `each'
/Users/adam/.rvm/gems/ruby-1.9.3-preview1/gems/rack-1.3.4/lib/rack/body_proxy.rb:23:in `method_missing'
/Users/adam/.rvm/gems/ruby-1.9.3-preview1/gems/rack-1.3.4/lib/rack/chunked.rb:23:in `each'
/Users/adam/.rvm/gems/ruby-1.9.3-preview1/gems/rack-1.3.4/lib/rack/handler/webrick.rb:71:in `service'
/Users/adam/.rvm/rubies/ruby-1.9.3-preview1/lib/ruby/1.9.1/webrick/httpserver.rb:138:in `service'
/Users/adam/.rvm/rubies/ruby-1.9.3-preview1/lib/ruby/1.9.1/webrick/httpserver.rb:94:in `run'
/Users/adam/.rvm/rubies/ruby-1.9.3-preview1/lib/ruby/1.9.1/webrick/server.rb:191:in `block in start_thread'

这是我试图运行的程序:

class EnvironmentOutput

  def call(env)
     ["200",{"Content-Type" => "text/plain"}, "Hello World"]
  end

end

run EnvironmentOutput.new

我是初学程序员,所以我不确定是什么时候发生的。尝试谷歌搜索但没有任何结果。

使用ruby 1.9.3 Rack 1.1

由于

4 个答案:

答案 0 :(得分:39)

这是Ruby 1.9.2中的一个变化,正如所建议的那样,如果用[“括号”]包围你的字符串,它会将“Hello World”变成一个具有单个值的数组。听起来很傻,但这就是交易:)。

以前,Ruby中的String会通过迭代的字符来响应每个字符串。显然,这种方式发生了变化。

答案 1 :(得分:8)

也许你可以试试这个。

require 'stringio'

class EnvironmentOutput
  def call(env)
   ["200",{"Content-Type" => "text/plain"}, StringIO.new("Hello World")]
  end
end

run EnvironmentOutput.new

根据rack spec,正文必须只产生字符串,但不能是字符串本身。具体说明未能这样做将不适用于1.9。我在这里做的是将字符串体包装在StringIO实例中。 StringIO的作用类似于文件句柄并返回字符串输出。

答案 2 :(得分:1)

因为错误是 ERROR Rack::Lint::LintError: Response body must respond to each. 你知道“Hello World”是一个简单的字符串,不支持每个。简单的答案就是将[]添加到字符串中,将其转换为数组,从而支持每个字符串。

class EnvironmentOutput
  def call(env)
    ["200",{"Content-Type" => "text/plain"}, ["Hello World"]]
  end
end

run EnvironmentOutput.new

答案 3 :(得分:0)

answer似乎回答了您的问题:

  

如果你看看机身部分下面的机架规格(见http://rack.rubyforge.org/doc/SPEC.html),它会说:

     

Body必须响应每个,并且必须只生成String值。 Body本身不应该是String的实例,因为这将在Ruby 1.9中破坏。