我正在阅读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
由于
答案 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中破坏。