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
Спасибо
Ответы
Ответ 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.