|
|||
#!/usr/bin/env ruby print "HTTP/1.0 200 OK\r\n" print "Content-type: text/html\r\n\r\n" print "<html><body>Hello World!</body></html>\r\n" |
CGI
verwenden.
CGI
liefert Hilfe beim Schreiben von CGI-Scripten. Mit ihr kann man Formulare, Cookies und die Umgebung manipulieren,
maintain stateful
sessions, and so on.
Die genaue Dokumentation gibt es im Referenz-Abschnitt ab Seite 501, aber wir riskieren hier schon mal einen schnellen Blick auf die Möglichkeiten.
%2F
'' übersetzt und muss vor der Benutzung wieder in ``/'' zurückübersetzt werden. Dafür gibt es in CGI
die Routinen
CGI.escape
und CGI.unescape
:
require 'cgi' puts CGI.escape( "Nicholas Payton/Trumpet & Flugel Horn" ) |
Nicholas+Payton%2FTrumpet+%26+Flugel+Horn |
require 'cgi' puts CGI.escapeHTML( '<a href="/mp3">Click Here</a>' ) |
<a href="/mp3">Click Here</a> |
require 'cgi' puts CGI.escapeElement('<hr><a href="/mp3">Click Here</a><br>','A') |
<hr><a href="/mp3">Click Here</a><br> |
A
''-Tag behandelt; andere Tags bleiben verschont. Jede dieser Methoden besitzt eine ``un
-''Version, um den Original-Zustand wiederherzustellen.
CGI
erlaubt einem den Zugriff auf die Parameter einer HTML-Anfrage auf zwei Wegen.
Nehmen wir an, wir haben folgende URL:
/cgi-bin/lookup?player=Miles%20Davis&year=1958
. Man kann dann auf die Parameter ``player
'' und ``year
'' mit CGI#[]
direkt zugreifen:
require 'cgi' |
||
cgi = CGI.new |
||
cgi['player'] |
» | ["Miles Davis"] |
cgi['year'] |
» | ["1958"] |
Hash
rausziehen:
require 'cgi' |
||
cgi = CGI.new |
||
h = cgi.params |
||
h['player'] |
» | ["Miles Davis"] |
CGI
enthält eine immense Anzahl an Methoden, um HTML zu erzeugen --- eine Methode pro Tag. Um diese Methoden zu benutzen, muss man ein CGI
-Objekt mit CGI.new
erzeugen und ihm den gewünschten HTML-Level mitgeben. In diesen Beispielen benutzen wir ``html3
''.
Um das Verschachteln von Tags einfacher zu machen, holen sich diese Methoden den Inhalt als Code-Block. Diese Code-Blöcke sollten einen
String
zurückgeben, der als Inhalt für den Tag dient. In diesem Beispiel haben wir ein paar überschüssige Zeilenumbrüche eingebaut, damit der Output auf eine Seite passt.
require "cgi" cgi = CGI.new("html3") # add HTML generation methods cgi.out{ cgi.html{ cgi.head{ "\n"+cgi.title{"This Is a Test"} } + cgi.body{ "\n"+ cgi.form{"\n"+ cgi.hr + cgi.h1 { "A Form: " } + "\n"+ cgi.textarea("get_text") +"\n"+ cgi.br + cgi.submit } } } } |
Content-Type: text/html Content-Length: 302 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN"><HTML><HEAD> <TITLE>This Is a Test</TITLE></HEAD><BODY> <FORM METHOD="post" ENCTYPE="application/x-www-form-urlencoded"> <HR><H1>A Form: </H1> <TEXTAREA COLS="70" NAME="get_text" ROWS="10"></TEXTAREA> <BR><INPUT TYPE="submit"></FORM></BODY></HTML> |
get_text
'', der den eingegebenen Text enthält.
CGI#out
setzen.
require "cgi" cookie = CGI::Cookie.new("rubyweb", "CustID=123", "Part=ABC"); cgi = CGI.new("html3") cgi.out( "cookie" => [cookie] ){ cgi.html{ "\nHTML content here" } } |
Content-Type: text/html Content-Length: 86 Set-Cookie: rubyweb=CustID%3D123&Part%3DABC; path= <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN"><HTML> HTML content here</HTML> |
CustID
und Part
wie im folgenden HTML-Output gezeigt erhalten.
require "cgi" cgi = CGI.new("html3") cgi.out{ cgi.html{ cgi.pre{ cookie = cgi.cookies["rubyweb"] "\nCookies are\n" + cookie.value.join("\n") } } } |
Content-Type: text/html Content-Length: 111 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN"><HTML><PRE> Cookies are CustID=123 Part=ABC</PRE></HTML> |
CGI::Session
-Klasse bearbeitet (ab Seite 508 dokumentiert), die auch Cookies benutzt aber ein höheres Level an Abstraktion bietet.
require "cgi" require "cgi/session" cgi = CGI.new("html3") sess = CGI::Session.new( cgi, "session_key" => "rubyweb", "session_id" => "9650", "new_session" => true, "prefix" => "web-session.") sess["CustID"] = 123 sess["Part"] = "ABC" cgi.out{ cgi.html{ "\nHTML content here" } } |
$TMP/web-session.9650
erzeugt mit dem key, value-Paar für CustID
und Part
.
Wenn der User jetzt wiederkommt, braucht man nur noch den Parameter, der die Session-Id angibt. In diesem Beispiel ist das rubyweb=9650
. Mit dem Wert aus diesem Parameter kann man sich dann den ganzen Satz der gesicherten Session-Daten holen.
require "cgi" require "cgi/session" cgi = CGI.new("html3") sess = CGI::Session.new( cgi, "session_key" => "rubyweb", "prefix" => "web-session.") cgi.out{ cgi.html{ "\nCustomer #{sess['CustID']} orders an #{sess['Part']}" } } |
eruby
oder erb
. Im Rest dieses Abschnitts bschreiben wir eruby
von Shugo Maeda.
Ruby in HTML einzubetten ist ein sehr machvolles Konzept --- man hat damit grundsätzlich die selben Fähigkeiten wie mit ASP, JSP oder PHP, aber mit der vollen Kraft von Rubin.
eruby
nichts anderes als ein Filter. Jeglicher Text, der vom Input kommt, wird unberührt weitergeleitet, mit den folgenden Ausnahmen:
Ausdruck | Beschreibung | |||||||
<% Ruby-Code%> |
Der Ruby-Code in spitzen Klammern wird durch sein Ergebnis ersetzt. | |||||||
<%= Ruby-Ausdruck%> |
Der Ruby-Ausdruck in spitzen Klammern wird durch seinen Wert ersetzt. | |||||||
<%# Ruby-Code%> |
Der Ruby-Code in spitzen Klammern wird ignoriert (beim Testen ganz nützlich). | |||||||
eruby
auf mit:
eruby [options][document] |
eruby
vom Standard-Input. Die Kommandozeilen-Optionen für eruby
zeigt Tabelle
14.1 auf Seite 151.
Kommandozeilen-Optionen für eruby
|
eruby
folgenden Input bearbeiten.
This text is <% a = 100; puts "#{a}% Live!" %> |
eruby
ersetzt den Ausdruck zwischen den spitzen Klammern und erzeugt
This text is 100% Live! |
<%a = 100%>This text is almost <%=a%> degrees! Cool! |
=a
durch den Wert von a
ersetzt.
This text is almost 100 degrees! Cool! |
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"> <html> <head> <title>eruby example</title> </head> <body> <h1>Enumeration</h1> <ul> <%(1..10).each do|i|%> <li>number <%=i%></li> <%end%> </ul> <h1>Environment variables</h1> <table> <%ENV.keys.sort.each do |key|%> <tr> <th><%=key%></th><td><%=ENV[key]%></td> </tr> <%end%> </table> </body> </html> |
.rhtml
'' Namensergänzung und konfiguriert den Web-Server so, dass er eruby
über diese Dateien laufen lässt, was dann den gewünschten HTML-Output ergibt.
Wenn man eruby
auf seinem Apache-Web-Server laufen lassen will, muss man folgende Schritte ausführen:
eruby
-Binär-Datei ins cgi-bin
-Verzeichnis.
httpd.conf
hinzu:
AddType application/x-httpd-eruby .rhtml Action application/x-httpd-eruby /cgi-bin/eruby |
DirectoryIndex
Anweisung so ändern, dass sie index.rhtml
enthält. Damit kann man Ruby auch ein Verzeichnis auflisten lassen, das kein index.html
enthält. Als Beispiel bringt die folgende Anweisung das eingebettete Ruby-Script dazu, nach index.rhtml
zu suchen, falls kein index.html
oder index.shtml
in dem Verzeichnis vorhanden ist.
DirectoryIndex index.html index.shtml index.rhtml |
DirectoryIndex index.html index.shtml /cgi-bin/index.rb |
CGI
-Bibliothek ab Seite 501 ansehen.
mod_ruby
(erhältlich in den Archiven), ein Apache-Modul, das einen kompletten Ruby-Interpreter in den Apache-Web-Server linkt. Die README
-Datei, die bei mod_ruby
dabei ist, sagt einem alles, wie man das kompilieren und installieren muss.
Ist das erstmal installiert und konfiguriert, dann kann man Ruby-Scripts genauso laufen lassen wie vorher ohne mod_ruby
, nur dass das Ganze jetzt wesentlich schneller ist.