Подтвердить что ты не робот

Rack Error "Rack:: Lint:: LintError: Тело ответа должно отвечать каждому"

Я прохожу учебник по учебнику 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

Я начинающий программист, поэтому я не уверен, что происходит. Пробовал поиск в Google, но ничего не получилось.

Использование ruby ​​1.9.3 Стойка 1.1

Спасибо

4b9b3361

Ответ 1

Это изменение в Ruby 1.9.2 и, как было предложено, если вы окружите свою строку с помощью [ "скобок" ], она превратит "Hello World" в массив с одним значением. Звучит глупо, но что сделка:).

Раньше было, что String в Ruby будет реагировать на каждую итерацию символов. Очевидно, произошли такие изменения.

Ответ 2

Возможно, вы можете попробовать это.

require 'stringio'

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

run EnvironmentOutput.new

В соответствии с спецификация стойки, тело должно выдавать только строки, но не должно быть самой строкой. В нем конкретно говорится, что неспособность сделать это не будет работать в 1.9. То, что я сделал здесь, - это обернуть тело строки в экземпляре StringIO. StringIO действует как дескриптор файла и возвращает вывод строки.

Ответ 3

так как ошибка 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

Ответ 4

Этот ответ отвечает на ваш вопрос:

Если вы посмотрите спецификацию стойки (здесь: http://rack.rubyforge.org/doc/SPEC.html), в разделе тела говорится:

Орган должен реагировать на каждый и должен давать только значения String. Само тело не должно быть экземпляром String, так как это сломается в Ruby 1.9.