|
|||
#!/usr/bin/env ruby print "HTTP/1.0 200 OK\r\n" print "Content-type: text/html\r\n\r\n" print "<html><body>Hola Mundo!</body></html>\r\n" |
CGI.
CGI brinda el soporte para escribir
scripts CGI. Con ella, puedes manipular formularios, cookies, el
entorno, mantener el estado de las sesiones, y demás. Está documentado
de manera completa en la sección de referencias a partir de la página
497, pero haremos una breve introducción en ésta sección.
%2F'' y deberá ser traducida
nuevamente a ``/'' para poder ser utilizada. Los espacios y ampersand
son también caracteres especiales. Para soportarlos,
CGI provee las rutinas
CGI.escape y 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 aquí</a>' ) |
<a href="/mp3">Click aquí</a> |
require 'cgi'
puts CGI.escapeElement('<hr><a href="/mp3">Click aquí</a><br>','A')
|
<hr><a href="/mp3">Click aquí</a><br> |
A'' resulta escapada; el resto se
dejan como están.
Cada uno de éstos métodos tiene una versión de ``un-'' para
recuperar la cadena original.
CGI tienes acceso a los
parámetros de búsqueda de HTML de dos maneras.
Supón que tenemos una URL
/cgi-bin/lookup?player=Miles%20Davis&year=1958. Puedes
acceder a los parámetros ``player'' y ``year''
usando CGI#[] directamente:
require 'cgi'
|
||
cgi = CGI.new
|
||
cgi['player']
|
» |
["Miles Davis"]
|
cgi['year']
|
» |
["1958"]
|
Hash:
require 'cgi'
|
||
cgi = CGI.new
|
||
h = cgi.params
|
||
h['player']
|
» |
["Miles Davis"]
|
CGI contiene bastantes métodos para crear HTML,
un método por etiqueta. Para habilitarlos, deberás crear un objeto
CGI invocándolo desde
CGI.new,
pasándole el nivel requerido de HTML.
En éstos ejemplos, utilizaremos ``html3''.
Para facilitar el anidado de etiquetas, éstos métodos toman el
contenido como bloques de código. El bloque de código deberá devolver
un String, el cual será utilizado como el
contenido para la etiqueta. En éste ejemplo, hemos añadido algunas
líneas en blanco adicionales para acomodar la salida en la página.
require "cgi"
cgi = CGI.new("html3") # añade los métodos de generación de HTML
cgi.out{
cgi.html{
cgi.head{ "\n"+cgi.title{"Esto es una Prueba"} } +
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>Esto es una Prueba</TITLE></HEAD><BODY> <FORM METHOD="post" ENCTYPE="application/x-www-form-urlencoded"> <HR><H1>A Form: </H1> <TEXTAREA NAME="get_text" ROWS="10" COLS="70"></TEXTAREA> <BR><INPUT TYPE="submit"></FORM></BODY></HTML> |
get_text''
conteniendo el texto que el usuario ingresó.
CGI#.
require "cgi"
cookie = CGI::Cookie.new("rubyweb", "CustID=123", "Part=ABC");
cgi = CGI.new("html3")
cgi.out( "cookie" => [cookie] ){
cgi.html{
"\ncódigo HTML aquí"
}
}
|
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> código HTML aquí</HTML> |
CustID y Part, como se
ve en la sig.salida HTML.
require "cgi"
cgi = CGI.new("html3")
cgi.out{
cgi.html{
cgi.pre{
cookie = cgi.cookies["rubyweb"]
"\nLas Cookies son\n" + cookie.value.join("\n")
}
}
}
|
Content-Type: text/html Content-Length: 111 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN"><HTML><PRE> Las Cookies son CustID=123 Part=ABC</PRE></HTML> |
CGI::Session
(documentado desde la pág.504), que utiliza cookies pero brinda
abstracciones de alto nivel.
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
con el par clave, valor para CustID y Part.
Al regresar el usuario, todo lo que necesitas es el parámetro que
indique id de sesión. En éste ejemplo, sería
rubyweb=9650. Con éste parámetro, podrás acceder a todos
los datos guardados de la sesión.
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 y erb. Durante el resto de
ésta
sección veremos eruby, de Shugo Maeda.
Embeber Ruby en HTML es un concepto potente; básicamente nos da una
herramienta equivalente a ASP, JSP o PHP, pero con todo el poder de
Ruby.
eruby actúa como un sencillo y simple filtro. Cualquier texto
en el archivo de entrada es introducido intacto, con excepción de:
| Expresión | Descripción | |||||||
<% código ruby %>
|
El código Ruby entre limitadores se reemplaza por su salida. | |||||||
<%= expresión ruby %>
|
La expresión Ruby entre limitadores se reemplaza por su valor. | |||||||
<%# código ruby %>
|
El código Ruby entre limitadores se ignora (de utilidad para pruebas). | |||||||
eruby:
eruby [
opciones
] [
documento
]
|
eruby leerá desde la entrada
estándar. Las opciones de línea de comando de eruby se
muestran en Tabla 14.1 en pag. 149.
Opciones de línea de comando para eruby
|
||||||||||||||||||||||||||||||
eruby en
la siguiente entrada.
This text is <% a = 100; puts "#{a}% Live!" %>
|
eruby sustituye la expresión delimitada y da como resultado
This text is 100% Live! |
<%a = 100%>This text is almost <%=a%> degrees! Cool! |
=a con el valor de a.
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'' y
configurar el servidor Web para ejecutar eruby con este
tipo de documentos para producir la salida HTML deseada.
Para utilizar eruby con el servidor Apache deberás:
eruby al directorio
cgi-bin.
httpd.conf:
AddType application/x-httpd-eruby .rhtml Action application/x-httpd-eruby /cgi-bin/eruby |
DirectoryIndex para incluir index.rhtml. De ésta
manera podrás utilizar Ruby para crear listados de directorios en
aquellos que no contengan un index.html. Como ejemplo, la
siguiente directiva, hace que el script embebido Ruby
index.rhtml sea buscado y mostrado si no existe ningún
index.html o index.shtml en el directorio.
DirectoryIndex index.html index.shtml index.rhtml |
DirectoryIndex index.html index.shtml /cgi-bin/index.rb |
CGI,documentada
a partir de la pag.497.
mod_ruby (disponible en los
repositorios), un módulo Apache que enlaza un intérprete Ruby
completo al servidor Web propiamente dicho. El archivo
README incluido en mod_ruby brinda con lujo de
detalles cómo compilar e instalarlo.
Una vez hecho, puedes ejecutar scripts Ruby tal como lo hicieras sin
mod_ruby, excepto que ahora se ejecutarán más rápidamente.