2009-04-12 3 views
0

Dies ist das Beispiel, das ich online sehe, wie man Cookies setzt.Wie funktioniert der CGI-Cookie in Ruby?

require "cgi" 
cookie = CGI::Cookie.new("rubyweb", "CustID=123", "Part=ABC"); 
cgi = CGI.new("html3") 
cgi.out("cookie" => [cookie]){ 
    cgi.html{ 
    "\nHTML content here" 
    } 
} 

ich es auf diese Weise versucht, zu tun und es das Cookie setzt und dann mit einer leeren Seite aufkommt.

#!/usr/local/bin/ruby 

require 'cgi' 
load 'inc_game.cgi' 
cgi = CGI.new 

cookie = CGI::Cookie.new("rubyweb", "CustID=123", "Part=ABC"); 
cgi.out("cookie" => [cookie]){""}  

#see if game submit buttons pressed 
doIt = cgi['play'] 
puts "Content-type: text/html\n\n" 

play = Game.new 

#welcome 
if doIt == '' 
puts play.displayGreeting 
end 

#choose weapon 
play.playGame 

if doIt == 'Play' 
    move = cgi['weapon'] 
    human = play.humanMove(move) 
    computer = play.ComputerMove 
    print human 
    print computer 
    result = play.results(human,computer) 
    play.displayResults(result) 
end 

Also meine Frage wäre zuerst, was vermisse ich/mache ich falsch? Zweitens frage ich mich, ob jemand erklären möchte, was .out im Gegensatz zu .header tut oder ob es einen Unterschied gibt?

Danke,

Levi

+0

Vom Lesen ein bisschen mehr fand ich heraus, dass cgi.out viel von dem behandelt, was cgi.header würde. Es ist also nur eine prägnantere Möglichkeit, die Ausgabe zu kontrollieren. – Levi

Antwort

2

Ich glaube, diese Zeile:

cgi.out("cookie" => [cookie]){""} 

Ist aus Ihrer Header Spülung.

Auf den Code bloßen in meinem TTY läuft,

 
Content-Type: text/html 
Content-Length: 0 
Set-Cookie: rubyweb=CustID%3D123&Part%3DABC; path= 

Content-type: text/html 

wurde emittieren, und "Content-Length: 0" (durch die leere Zeichenkette in out erzeugt {}) möglicherweise erzählt den Browser du bist erledigt.

cookie = CGI::Cookie.new("rubyweb", "CustID=123", "Part=ABC"); 
cgi.header("cookie" => [cookie] , type => 'text/html') 

#normal printing here 

Wäre für das Senden von Headern vorzuziehen.

Die Entscheidung für ein 'do processing' - 'think think output' Modell könnte helfen.

+0

Das Senden der Kopfzeile verursachte einen internen Serverfehler, dies ist die Option, die am besten für mich funktioniert. Das Senden der Ausgabe am Ende verursacht auch einen internen Serverfehler, höchstwahrscheinlich, weil ich Text im Hauptteil drucke und der Druckinhalt erst am Ende gesetzt wird. – Levi

+0

Betrachten Sie es zumindest als einen Konstruktionsfehler. Es ist wirklich keine gute Idee (im Allgemeinen), Druckanweisungen tief in Zufallscode zu haben –

+0

Ok, ich werde das im Hinterkopf behalten. Haben Sie eine Idee, warum der Header bei Ihrem ersten Vorschlag einen internen Serverfehler auslösen würde? Ich sende es, bevor etwas gedruckt wird. – Levi