Domanda Errore di Rack "Rack :: Lint :: LintError: il corpo di risposta deve rispondere a ciascuno"


Sto esaminando il tutorial sul rack tekpub ma quando provo a eseguire anche un programma di base nel rack ottengo questo errore.

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'

Questo è il programma che sto cercando di eseguire:

class EnvironmentOutput

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

end

run EnvironmentOutput.new

Sono un programmatore principiante quindi non sono sicuro di cosa stia succedendo. Provate le ricerche su google ma non è emerso nulla.

Utilizzo di Ruby 1.9.3 Rack 1.1

Grazie


19
2017-10-09 02:46


origine


risposte:


Questo è un cambiamento in Ruby 1.9.2 e, come è stato suggerito, se si circonda la stringa con ["parentesi"] si trasformerà "Hello World" in una matrice con un singolo valore. Sembra sciocco, ma questo è l'affare :).

In passato una stringa in Ruby rispondeva a ciascuna con un'iterazione di caratteri. Evidentemente ci sono stati cambiamenti in questo modo.


38
2017-10-09 06:51



Forse puoi provare questo.

require 'stringio'

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

run EnvironmentOutput.new

Secondo il spec, il corpo deve solo produrre stringhe, ma non deve essere una stringa stessa. In particolare afferma che non riuscire a farlo non funzionerà in 1.9. Quello che ho fatto qui è avvolgere il corpo della stringa in a StringIO esempio. StringIO si comporta come un handle di file e restituisce l'output di stringa.


7
2017-10-09 03:12



poiché l'errore è ERROR Rack::Lint::LintError: Response body must respond to each.  si ottiene che "Hello World" è una stringa semplice, non supporta ciascuno. La semplice risposta a questo è solo aggiungere [] alla stringa, trasformandola in un array e quindi supportandone ciascuno.

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

run EnvironmentOutput.new

1
2017-12-18 20:08



Questo risposta sembra rispondere alla tua domanda:

Se verifichi le specifiche del rack (qui trovate: http://rack.rubyforge.org/doc/SPEC.html) sotto la sezione del corpo dice:

Il corpo deve rispondere a ciascuno e deve solo fornire valori stringa. Il corpo stesso non dovrebbe essere un'istanza di String, in quanto questo si spezzerà in Ruby 1.9.


0
2017-10-09 03:13