HelloWorld Rack程序:NoMethodError:未定义的方法`each'

时间:2013-11-26 16:52:45

标签: ruby rack

我正在尝试执行以下HelloWorld机架程序并收到错误。感谢任何帮助。

ruby​​ version ruby​​ 1.9.3p448(2013-06-27)[x86_64-cygwin]

# helloworld.rb
require 'rack'
require 'rack/server'

class HelloWorld
 def response
   [200, {}, 'Hello World']
 end
end

class HelloWorldApp
 def self.call(env)
   HelloWorld.new.response
 end
end

Rack::Server.start :app => HelloWorldApp

ERROR

[2013-11-26 11:23:03] ERROR NoMethodError: undefined method `each' for "Hello World":String
    /usr/lib/ruby/gems/1.9.1/gems/rack-1.5.2/lib/rack/handler/webrick.rb:72:in `service'
    /usr/lib/ruby/1.9.1/webrick/httpserver.rb:138:in `service'
    /usr/lib/ruby/1.9.1/webrick/httpserver.rb:94:in `run'
    /usr/lib/ruby/1.9.1/webrick/server.rb:191:in `block in start_thread'

2 个答案:

答案 0 :(得分:12)

变化:

def response
  [200, {}, 'Hello World']
end

为:

def response
  [200, {}, ['Hello World']]
end

答案 1 :(得分:3)

#response返回的数组中的第3项(即body)必须响应#each方法。例如,数组respond to #each

来自Rack specification

  

身体

     

Body必须响应每个,并且必须只生成String值。该   正文本身不应该是String的实例,因为它会破坏   Ruby 1.9。如果身体响应关闭,它将被调用   迭代。如果在行动之后身体被中间件取代,那么   原始身体必须先关闭,如果它响应关闭。如果   正文响应to_path,它必须返回一个标识符的字符串   文件的位置,其内容与生成的文件的内容相同   叫每一个;这可以被服务器用作替代方案,   可能更有效的方式来传输响应。身体   通常是一个字符串数组,应用程序实例本身,或者   类似文件的对象。