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

AFr*_*ser 20 ruby rack ruby-on-rails

我正在浏览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'
Run Code Online (Sandbox Code Playgroud)

这是我试图运行的程序:

class EnvironmentOutput

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

end

run EnvironmentOutput.new
Run Code Online (Sandbox Code Playgroud)

我是初学程序员,所以我不确定它是怎么回事.尝试谷歌搜索但没有任何结果.

使用ruby 1.9.3 Rack 1.1

谢谢

小智 39

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

过去,Ruby中的String会通过迭代的字符来响应每个字符串.显然,这种方式有所改变.

  • 解决方案是正确的,但真正的解释是,机架尝试迭代数组并尝试向HTTP连接发送响应,读取数组中的所有元素并以块的形式发送.如果您认为可以创建一个块来控制响应主体的流式传输,则非常有用. (5认同)

Bla*_*lor 8

也许你可以试试这个.

require 'stringio'

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

run EnvironmentOutput.new
Run Code Online (Sandbox Code Playgroud)

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

  • 一个更简单的替代方法可能是将String包装在一个数组中:`["200",{"Content-Type"=>"text/plain"},["Hello World"]]` (3认同)