【问题标题】:Rack Error "Rack::Lint::LintError: Response body must respond to each"机架错误“Rack::Lint::LintError:响应正文必须响应每个”
【发布时间】:2011-12-03 19:21:24
【问题描述】:

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

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 机架 1.1

谢谢

【问题讨论】:

    标签: ruby-on-rails ruby rack


    【解决方案1】:

    也许你可以试试这个。

    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 的作用类似于文件句柄并返回字符串输出。

    【讨论】:

    • 一个更简单的选择可能是将字符串包装在一个数组中:["200",{"Content-Type" => "text/plain"}, ["Hello World"]]
    • 不错的提示马特,确实简单得多。
    • 太棒了,谢谢大家...轻松修复,花了大约 2 个小时寻找答案 :)
    【解决方案2】:

    这个answer 似乎回答了你的问题:

    如果您查看主体部分下的机架规格(在此处找到:http://rack.rubyforge.org/doc/SPEC.html),它会显示:

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

      • 谢谢 Rob,你会支持我的投票,但我需要更多声望 :)
      • 解决方案是正确的,但真正的解释是 rack 尝试迭代数组并尝试将读取数组中所有元素的响应发送到 HTTP 连接并以块的形式发送。如果您认为可以创建一个块来控制响应主体的流式传输,这将非常有用。
      • ["200",{"Content-Type" => "text/plain"}, ["Hello World"]] 适合我
      【解决方案4】:

      因为错误是 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
      

      【讨论】:

      • 在我的情况下,响应字符串周围只需要 []
      猜你喜欢
      • 2012-07-21
      • 2012-08-30
      • 2015-11-08
      • 2017-03-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-13
      • 1970-01-01
      相关资源
      最近更新 更多