You are on page 1of 73

Capitulo

Ruby en la WEB
Ruby no es desconocido en la web, tiene sus servidores para correo electrnico, demonios
FTP, y servidor de aplicaciones. Este capitulo se enfoca en el servidor de aplicaciones y las
utilidades que podemos dar a este.

4. Ruby en la Web

4.1. Servicios que ofrece Ruby en la Web

En los ltimos aos un gran promedio de personas de la sociedad han utilizado un
servicio basado en la Web, ya sean estos e-mails, foros, noticias, o las pginas Web. Y
por ello los lenguajes de programacin han ido evolucionando, y Ruby no ha sido la
excepcin podemos encontrar algunos servidores desarrollados en este lenguaje, y
tambin tenemos la posibilidad de escribir nuestros propios servidores.
En la actualidad existen varios proyectos de licencia GPL
39
, corriendo por Internet, con
el objetivo de crear varios tipos de servicios, lo que ha ayudado a que cada vez mas
personas se vinculen a Ruby y a sus utilidades.
4.1.1. Servidores SMTP

Ruby tiene varios proyectos para el servicio Mail, uno de ellos se llama RubyMail,
desarrollado en el 2004 por Matt Armstrong, este es un paquete que posee varias clases
y mdulos, que permite enviar mensajes mail de tipo MIME
40
, aunque este es un
servicio muy bsico de Mail sirve para los propsitos mas comunes como el envio y
recepcin de mensajes, y su instalacin es por medio de un paquete, haciendo que se
simplifique y sea multiplataforma, algunas de sus caractersticas principales son:
x Es rpido y eficiente
x Es fcil de instalar y configurar.
x Base64 y codificacin de impresin por partes.
x Funciona desde Ruby 1.6.7 y posteriores.

39
Licencia para los programas de libre distribucin
40
MIME (Multipurpose Internet Mail Extensions, Extensiones de Correo Internet Multipropsito), son
una serie de convenciones o especificaciones dirigidas a que se puedan intercambiar a travs de
Internet todo tipo de archivos (texto, audio, vdeo, etc.) de forma transparente para el usuario.
RubyMail es un proyecto que comenz con licencia libre GPL en estos momentos el
proyecto ha pasado a ser pagado con algunas caractersticas dems de las que ya se
menciono. Sin embargo aun se existen las dos versiones la libre y la de pago. Puede
encontrar su versin de libre distribucin en RubyForge
41
y su versin propietaria mas
completa en www.Rubymail.com.
Existe un proyecto mas especializado para el servicio SMTP, su creador Luben
Manolov, el 8 de diciembre del 2005 crea un servicio mail va Web llamndolo Mailr,
igual que RubyMail lo realiza bajo licencia libre. Este puede ser utilizado en conjunto
con RoR
42
. La aplicacin fue probada con Courier-IMAP, pero es posible que funcione
con un el servidor IMAP
43
, podemos destacar los siguientes servicios, ofrecidos por
Mailr:
x Usa el protocolo IMAP
x Posee una conexin al servidor tipo Cache IMAP
x Puede tener mensajes de composicin HTML y plainttext
x Se puede importar los contactos mediante un archivo CSV.
x Se basa en Ajax el autocompletar de las direcciones.
x Posee un filtrado mediante Maildrop
x Se basa en el estndar i18n de el manual de Sascha Ebach


41
Pagina con los proyectos de libre distribucin con base a Ruby.
42
Ruby on Rails, servicio de aplicaciones Web basado en Ruby
43
IMAP (Internet Message Access Protocol) es un protocolo de red de acceso a mensajes electrnicos
almacenados en un servidor.

Figura 4.1. Mailr servicio de Mail va Web basado en Ruby
Fuente. El Autor, 2008



La ltima actualizacin de Mailr esta en la versin 1.7, desarrollada en el 2006, se la
puede descargar desde su pagina oficial Mailr.org o desde RubyForge, aunque esta
ltima no posee su versin actualizada, como es comn en programas basados en
licencias libre podemos descargarnos su cdigo fuente o el binario.
Servidores SMTP
Nombre Creador Servicio
Ruby Mail Matt Armstrong Servicio de mensajes de
tipo texto.
Mailr Luben Manolov Permite mensajes de tipo
HTML, y plaintext
Tabla 4.1. Servidores SMTP basados en Ruby.
Fuente. El Autor, 2008

4.1.2. Demonio FTP

Podemos encontrar paquetes especializados para este tipo de servicio, ya creados como
el Chilkat Ruby FTP library, una librera que promueve un servidor FTP avanzado y
fcil de usar, esta librera funciona de manera estable hasta con 10000 cuentas de
usuario, la licencia permite la actualizacin del paquete cuando existan nuevas
versiones, sin comprar de nuevo el producto, adems de un ao de soporte tcnico,
algunas de las caractersticas mas relevantes acerca de este producto son:
x Archiva de modo sincrnico y asincrnico de manera directa
x Soporta FTPS
44
, FTP
45
, SSL
46
3.0 y TSL
47
1.0
x Posee un soporte internacional en casi todos los lenguajes
x Lista los directorios automticamente
x Sesiones con contrasea
x Todas las operaciones asincrnicas son restaurables
x Posee seguridad FTP usando AUTH TLS
48

x Creacin remota de directorios
x Actualizaciones completamente gratis.

44
FTPS (comnmente referido como FTP/SSL) es un nombre usado para abarcar un nmero de formas
en las cuales el software FTP puede realizar transferencias de ficheros seguras.
45
FTP (File Transfer Protocol) es un protocolo de transferencia de archivos entre sistemas conectados a
una red TCP
46
SSL Secure Sockets Layer es un protocolo criptogrfico que proporciona comunicacion segura en
Internet.
47
TSL son las siglas de TEST AND SET LOCK, una instruccin hardware, utilizada por ciertos procesadores
para facilitar la creacin de semforos y otras herramientas necesarias para la programacin
concurrente en computadores.
48
AUTH TLS nombrado por el comando emitido para indicar que la seguridad TLS es obligatoria. Este es
el mtodo preferido de acuerdo al RFC que define FTP sobre TLS.

Pero tambin podemos escribir nuestro propio servidor FTP, en poco tiempo y
aproximadamente con 200 lneas de cdigo, haciendo posible explorar directorios y
descargar archivos. Esto es posible ya que el servidor FTP, se basa en un protocolo
relativamente simple, al momento de programarlo con Ruby.
Una de las ventajas de usar un servidor FTP Ruby, es la simplicacin en crear
caractersticas como la categorizacin y un sistema de archivos no jerrquico.
Tambin la diversidad de plataformas que Ruby nos permite, obteniendo total libertad
al momento de crear nuestro servidor, por ejemplo podemos cambiar de un servidor
en Konqueror
49
a un sistema Mac OSX
50
sin sufrir grandes cambios.

4.1.3. Servidor Web

Los Servicios Web no estn afuera de las fronteras de este lenguaje, ya sea utilizando a
Ruby para crear programas CGI
51
, o utilizando una manera mas dinmica y eficiente
como es su paquete RoR. Ruby es una buena opcin en crear aplicaciones Web en
reemplazo de otros lenguajes como PHP
52
, y JSP
53
por ejemplo.
En este captulo se tomar en cuenta el paquete RoR de Ruby, ya que es uno de los ms
utilizados en la actualidad para crear aplicaciones Web, pero adems porque goza de
mejor eficiencia y eficacia, que programando con CGI.
4.2. Ruby on Rails


49
Konqueror distribucin de Linux basada en Debian.
50
Mac OS X es el actual sistema operativo de la familia de ordenadores Macintosh.
51
Common Gateway Interface es una importante tecnologa de la World Wide Web que permite a un
cliente solicitar datos de un programa ejecutado en un servidor web.
52
PHP es un lenguaje de programacin usado normalmente para la creacin de pginas web dinmicas.
53
JSP es una tecnologa Java que permite generar contenido dinmico para web, en forma de
documentos HTML, XML o de otro tipo.
Es un framework
54
de aplicaciones Web de cdigo abierto escrito en el lenguaje de
programacin Ruby. Trata de combinar la simplicidad con la posibilidad de desarrollar
aplicaciones del mundo real escribiendo menos cdigo que con otros Frameworks y con
un mnimo de configuracin.
Ruby on Rails se acopla a cualquier infraestructura de aplicacin Web. Adems se
distribuye a travs de RubyGems, haciendo multiplataforma, fcil de instalar y
configurar.
4.2.1. Introduccin a Rails

Ruby on Rails en poco tiempo ha llegado a ser considerado como uno de los mejores
Framework para el desarrollo de aplicaciones Web, y est entre los ms importantes en
el mundo de cdigo libre, como dato tenemos que en los ltimos aos se han escrito
mayor numero de libros para RoR, que los que se escribieron para otros Framework
como es el caso de Java
55
.
Ha ido creciendo de una forma acelerada gracias a que cada vez mas personas se dan
cuenta de los grandes alcances que se tiene al programar con Ruby, y mucho mas
utilizar un framework para crear aplicaciones Webs funcionales en tan solo 10 minutos
como lo hace RoR.
Rails es un completo entorno para desarrollar aplicaciones Web con base de datos de
acuerdo con la estructura Modelo-Vista-Control. Desde el Ajax en la vista, a la peticin
y respuesta en el controlador, hasta el modelo de nuestra base de datos.
Con este entorno de desarrollo podemos implementar aplicaciones con menos lneas de
cdigo, en menos tiempo y por supuesto con gran calidad. A menores lneas de cdigo
nos determina que el desarrollo sea ms rpido y con menos errores, lo que har que el
cdigo sea fcil de entender, mantener y mejorar.
Y por ltimo tenemos que hablar sobre su propia convencin, en lugar de archivos de
configuracin, una aplicacin Rails utiliza una serie de convenciones simples que son

54
Un framework es una estructura de soporte definida en la cual otro proyecto de software puede ser
organizado y desarrollado
55
Lenguaje orientado a objetos desarrollado por Sun Microsystems.
fciles de entender y sin necesidad de grandes conocimientos, sino mediante una
reflexin y descubrimiento.
4.2.1.1. Fortalezas de Rails

Ya que RoR se basa en Ruby, todas las fortalezas que tiene este, recaen en Ruby on
Rails, pero adems de las estas fortalezas, RoR aade sus fortalezas como son:
x RoR posee licencia GPL
56
, la cual nos permite modificar, crear nuevas clases, y
distribuir sin ninguna restriccin.
x Ruby funcionan bajo los sistemas operativos modernos, como puede ser
Windows Vista y Mac OSX 5.
x RubyGems es un manejador de libreras de Ruby que hace muy sencillo instalar
libreras. Es indispensable para cualquier usuario experimentado del lenguaje
Ruby permite extender las funcionalidades del lenguaje de una manera rpida y
sencilla.

x Utiliza el patrn de diseo MVC, es uno de los mejores en el momento de crear
programas interactivos orientados a objetos. Al aplicar esta separacin, se hace
posible crear ms de una vista para el mismo modelo, y reutilizar el modelo para
escribir utileras relacionadas, o incorporar datos del dominio original en
programas ms grandes.

x Scaffolding o escalamiento es un mtodo automtico para la creacin de las
pantallas de crear, modificar, listar y eliminar los datos.

x Meta programacin es una tcnica para escribir programas, Ruby a diferencia de
otros Frameworks no genera cdigo innecesario, sino lo hace de manera
eficiente y fcil de comprender a los usuarios.

56
Licencia GPL es una licencia creada por la Free Software Foundation a mediados de los 80, y est
orientada principalmente a proteger la libre distribucin, modificacin y uso de software
x Para la utilizacin de RoR no se requiere de una extensa configuracin en
nuestras mquinas, ya que es posible instalarlo y configurarlo sin tener
dificultades.

x Posee mdulos de pruebas para nuestra aplicacin, ya que Ruby es intuitivo,
crea de manera automtica pruebas simples, pero adems de esto podemos
utilizar el mdulo de pruebas para crear nuestras propias y que la aplicacin est
en un ptimo funcionamiento.

x Existe documentacin, foros, artculos, videos y grupos, que ayudan a resolver
cualquier problema que se nos presente en el momento de desarrollo.

x Ruby posee varias alianzas con algunos productos de software libre, haciendo
posible encontrar un paquete instalador con todo lo que se necesita para
programar aplicaciones RoR, este paquete llamado InstantRails contiene el
servidor apache, Ruby (una de las versiones mas actuales), RoR, y la base de
datos MySql
57
, todas estas aplicaciones completamente configuradas para la
utilizacin con Ruby on Rails.

x Ningn otro Framework permite el desarrollo de una aplicacin Web funcional
en 10 minutos.

4.2.1.2. Organizacin

En el momento de creacin de una aplicacin Ruby on Rails, se realiza de una manera
extraordinaria con respecto a su organizacin de los elementos, que va ha contener esta,
permitiendo tener por separado y de una manera muy ordenada cada uno de los
elementos, para futuras actualizaciones. Esto hace posible que en el momento de crear o

57
MySQL es un sistema de gestin de base de datos relacional, multihilo y multiusuario con ms de seis
millones de instalaciones.
modificar un modulo este no afecte a los dems. El esquema define Ruby al momento
de crear un proyecto es el siguiente:
x app
Es donde estn organizados los componentes de la aplicacin. Dentro de esta se
encuentra compuesta por varios subdirectorios que poseen la ayuda, los
controles, y la parte lgica del negocio.
x Components

Este directorio contiene componentes creados automticamente los cuales unen
la vista, el control y el modelo.

x Config

La pequea configuracin que la aplicacin necesita, incluyendo la
configuracin de la base de datos, la estructura de ambiente, y las llamadas se
encuentran en este directorio.

x db

Este directorio posee la manera en como Ruby on Rails se comunica hacia la
base de datos, con los scripts que posee internamente tenemos la opcin de
modificar, si es necesario, para un mejor manejo de nuestra base de datos.

x doc
En el directorio doc, como en otros Frameworks es destinado a la
documentacin de nuestra aplicacin, para ello se puede utilizar un Framework
especializado para este trabajo llamado RubyDoc.

x lib
Como es comn es utilizado para colocar libreras que se necesitan en la
aplicacin.

x log
Encontramos los registros de todo el proyecto, podemos encontrar informacin
histrica acerca de nuestro servidor, del desarrollo, de las pruebas y de los
errores que hayan ocurrido.

x Public
Es un directorio publico que poseen los servidores Web, en este directorio se
encuentran los elementos que son de poca importancia, adems que cambian
pocas veces, entre estos estn las imgenes, javascripts, y archivos HTML.

x Script
Este directorio contiene los scripts que manejan y son lanzados con Rails.
x Test
Se encuentran todas las pruebas que se han realizado esta se divide en
subdirectorios diferentes para cada tipo de prueba como pueden ser las pruebas
funcionales, de unidades, etc.
x Tmp
Este directorio posee todos los archivos temporales, estos son creados como
paso intermedio en la ejecucin de una llamada al servidor.
x Vendor
Esta posee todo tipo de libreras que fueron compradas para la creacin de la
aplicacin, y pueden ser para la seguridad, manejo de las base de datos y otro
tipo de herramientas.
4.2.1.3. MVC

Son las siglas de Model, View and Control, un modelo de creacin de aplicaciones
desarrollado en los 70s, este diseo de programacin evolucion la estrategia en la
comunidad de Smalltalk
58
, acoplando la lgica del negocio con su presentacin. Con el
MVC ponemos tener por separado la lgica del negocio, los objetos, y su manera de
presentacin.
Dicha separacin hace posible la creacin de ms de una vista para el mismo modelo,
haciendo posible la reutilizacin del modelo en el momento de crear o modificar la
presentacin.
Para aclarar la idea del funcionamiento de este diseo, lo podemos apreciar en la
siguiente figura, en esta se muestra la interaccin que tiene cada una de sus partes.


58
Smalltalk es un sistema informtico que permite realizar tareas de computacin mediante la
interaccin con un entorno de objetos virtuales.

















Figura 4.2. Interaccin de Modelo-Vista-Controlador.
Fuente. El Autor, 2008

En el momento en que el cliente enva una solicitud al servidor, esta solicitud llega a
un distribuidor donde este pasa la URL e invoca a determinada accin, en un
determinado controlador, la accin solicitada puede llamar al modelo, y para finalizar
este es posible que invoque a una vista, la cual es enviada como respuesta al cliente.

Para la creacin de una aplicacin con el modelo MVC en Rails lo que debemos es abrir
un terminal del Sistema Operativo y dar el comando:
Rails <nombre del proyecto>

Cliente Web

Documento HTML
(Solicitud)
Documento HTML
(Respuesta)
Servidor
Distribuidor
Controlador
Vista Modelo

Figura 4.3. Ejecucin del comando Rails en Windows.
Fuente. El Autor, 2008
Al momento de ejecutar se crear un directorio con el nombre del proyecto el cual
contendr un rbol de carpetas y archivos que conforma una aplicacin Rails vaca, la
estructura de las carpetas que se crear esta especificada en el punto anterior llamado
organizacin.



Figura 4.4. rbol de archivos creado al finalizar el comando Rails.
Fuente. El Autor, 2008


Nouelo
El Modelo consiste en las clases que representan a las tablas de la base de datos. En
Ruby on Rails, las clases del Modelo son gestionadas por ActiveRecord. Por lo general,
lo nico que tiene que hacer el programador es heredar de la clase ActiveRecord:: Base,
y el programa averiguar automticamente qu tabla usar y qu columnas tiene. Para
ello se utiliza un estndar en los nombres de las clases de los modelos.
En el punto de Active Record bsico comenzaremos a ver la configuracin y la creacin
de nuestro modelo y la relacin que tiene a una base de datos.

Contiolauoi
Las clases del Controlador responden a la interaccin del usuario que invocan a la
lgica de la aplicacin, que a su vez manipula los datos de las clases del Modelo y
muestra los resultados usando las Vistas. En las aplicaciones web basadas en MVC, los
mtodos del controlador son invocados por el usuario usando el navegador web. La
implementacin del Controlador es manejada por el ActionPack de Rails, que contiene
la clase ApplicationController.


4.2.1.3.2.1. Creacin

Las clases de los controladores gestionan las peticiones web del usuario. Para crear el
controlador en RoR, se usa un generador de script. Este generador recibir como
parmetros el tipo de objeto y el nombre del nuevo controlador. Por ejemplo:
ruby script/generate controller <Nombre del Archivo>




Figura 4.5. Ejemplo de creacin de un controlador.
Fuente. El Autor, 2008

Al finalizar de ejecutar este comando se crean varios archivos relacionados con el
control de la aplicacin, los cuales son:
application.rb
Este archivo es creado como seguridad, su funcin es para el tamao que va ha tomar la
aplicacin.
<nombre del archivo>_controller_test.rb
Este archivo es creado para las pruebas del nuevo controlador, gracias a este
automticamente tenemos una manera de dar un mantenimiento de calidad y una
construccin de manera amena.

<nombre del archivo>_helper.rb
La ayuda de Rails no se tiene de una manera desordenada, tampoco se repite para eso
posee su propia carpeta donde se crea la ayuda de todos los archivos de la aplicacin.
4.2.1.3.2.2. Corriendo el controlador

Despus de tener creado nuestro controlador, ya podemos tener una primera vista en
cualquier explorador, poniendo la direccin http://127.0.0.1:3000/ y el nombre de
nuestra aplicacin, por ahora no va a encontrar el archivo, pero nos va ha devolver un
error de no encontrar un ndice.

Esto se debe a que por el momento no le hemos indicado al controlador realizar alguna
accin. Para indicar acciones debemos modificar el controlador, por ejemplo: Al
momento en que se llama al controlador, y no se le indica ninguna accin RoR supone
que este es el ndice y busca al mtodo ndex dentro de este controlador, y si no lo
encuentra devuelve el error de ndice no encontrado.

Si colocamos el mtodo al momento de llamar a este controlador, sin acciones este nos
devolver las acciones definidas en el mtodo ndex, por ejemplos si editamos en el un
controlador llamado Mascota_controller.rb :

class MascotaController < ApplicationController
def index
render :text=>"<h1>Pagina ndice</h1>"
end
end

Al guardar este archivo y llamarlo desde el explorador http://localhost:3000/Mascota
este nos devolver:



Figura 4.6. Ejemplo del mtodo ndex
Fuente. El Autor, 2008

Como podemos apreciar es relativamente sencillo ver nuestra primera pgina creada en
el explorador.

vista
Vista es la lgica de visualizacin, o cmo se muestran los datos de las clases del
Controlador. Con frecuencia en las aplicaciones web la vista consiste en una cantidad
mnima de cdigo incluido en HTML.
Existen en la actualidad muchas maneras de gestionar las vistas. El mtodo que se
emplea en Rails por defecto es usar Ruby Embebido (archivos .rhtml), que son
bsicamente fragmentos de cdigo HTML con algo de cdigo en Ruby, siguiendo una
sintaxis similar a JSP. Tambin pueden construirse vistas en HTML y XML con
Builder
59
o usando el sistema de plantillas Liquid
60
.


59
Builder es usado para permitir la creacin de una variedad de objetos complejos desde un objeto
fuente (Producto),
60
Liquid es el gemelo y archinemsis de Solid Snake, as como comandante de campo de FOXHOUND y
de los Genome Soldiers.
4.2.1.3.3.1. Creacin

Para seguir la convencin de MVC, el siguiente paso que debemos realizar es crear una
vista para los controladores, de esta manera tener por separado el controlador de la vista
que se le da al cliente.
Como se usa en otros Frameworks, Ruby tambin puede utilizar plantillas para las
vistas, una plantilla para Ruby es una simple pgina HTML con cdigo Ruby, parecido
a lo que realizan los dems lenguajes como JSP
61
, PHP
62
, ASP
63
, etc. El cdigo de Ruby
es ejecutado por el servidor y devuelve al cliente una pgina HTML.
A diferencia de los otros Frameworks, Ruby puede generar las vistas, esto lo hace con el
comando que genera el controlador, pero con un parmetro ms el cual es el nombre de
la vista.
ruby script/generate controller <nombre del controlador> {nombre de la vista}
Por ejemplo, si queremos crear una vista para el controlador que se realiz en ejemplos
anteriores llamado Mascota, debemos dar el siguiente comando:
ruby script/generate controller Mascota index
Ya que tenamos creado el controlador, Ruby nos preguntar si queremos sobrescribirlo,
a lo cual ponemos si, ya que no hemos creado mtodos importantes.


61
JSP (JavaServer Pages) es una tecnologa Java que permite generar contenido dinmico para web, en
forma de documentos HTML, XML o de otro tipo.
62
PHP es un lenguaje de programacin usado normalmente para la creacin de pginas web dinmicas.
63
ASP (Active Server Pages) es una tecnologa del lado servidor de Microsoft para pginas web
generadas dinmicamente, que ha sido comercializada como un anexo a Internet Information Server.

Figura 4.7. Creacin de una vista para el controlador Mascota
Fuente. El Autor, 2008

Al finalizar de ejecutar este comando, a diferencia de ejecutar solo el controlador sin
vista, se crea un archivo llamado index.rhtml, el cual es nuestra vista, si abrimos este
encontraremos que es netamente cdigo HTML
64
, y al momento de llamar al
controlador http://localhost:3000/Mascota este ya no se mostrar el controlador si no la
vista creada.

Figura 4.8. Controlador mascota con vista.
Fuente. El Autor, 2008


64
HTML es el acrnimo ingls de HyperText Markup Language, que se traduce al espaol como Lenguaje
de Etiquetas de Hipertexto
4.2.1.3.3.2. Unin entre vista y controlador

En RoR la vista y el controlador estn unidas automticamente, teniendo toda la parte
esttica en el rhtml de la vista y la parte dinmica dentro del controlador, y para llamar
al controlador simplemente tenemos que recurrir a etiquetas de HTML, por ejemplo:
Declaremos dentro del mtodo ndex una variable llamada msj_Bienvenida, en esta
tendremos un mensaje que luego se ver en el HTML. Para esto primero modificamos el
mtodo del controlador:

Figura 4.9. Definicin de una variable dentro del mtodo ndex, del controlador
mascota.
Fuente. El Autor, 2008


Ahora para referirnos a esta variable dentro del rhtml, colocamos la siguiente lnea en la
vista:
<h2><%= @mensaje_Bienvenida %> </h2>
Luego de colocar esta variable en nuestra pgina rhtml, y abrir en el explorador vemos
como muestra lo que tiene la variable como mensaje en la rhtml:

Figura 4.10. Mensaje de la primera variable.
Fuente. El Autor, 2008

Como podemos ver todo lo que se encuentra entre <% y %> es considerado como
cdigo Ruby, y este es ejecutado por el servidor, adems de variables podemos declarar
cualquier expresin y Scriptles
65
, en ambos casos existe una interaccin con los valores
puestos en el controlador.
Como un ejemplo un poco ms avanzado declaremos una tabla, para esto todos los
datos los declararemos dentro del controlador y los visualizaremos en la vista.
Figura 4.11. Declaracin de una matriz dentro del controlador.
Fuente. El Autor, 2008

65
Scriptles son partes de cdigo Java incrustadas entre los elementos estticos de la pgina.

Y hora lo llamaos en el archivo rhtml de la siguiente manera:
<h1>Ejemplo de la Tabla</h1>
<table>
<tr>
<% @tabla1["cabeceras"].each do |head| %>
<td><b>
<%=head %>
</b>
</td>
<% end %>
</tr>
<% @tabla1["datos"].each do |fila| %>
<tr>
<%fila.each do |dato| %>
<td>
<%=dato %>
</td>
<% end %>
</tr>
<% end %>
</table>
Y por supuesto lo visualizamos en el explorador

Figura 4.12. Ejemplo de utilizacin de datos en una tabla
Fuente. El Autor, 2008

Como pudimos ver en los ejemplos, Ruby on Rails poseemos una completa libertad de
lo que es la manera en mostrar los datos y su lgica, de esta manera podemos realizar
de una misma lgica (controlador) y tener varias vistas de estas.


4.2.2. Active Record Bsico

El Active record, es la interaccin que vamos a poseer entre nuestra aplicacin y la base
de datos, en el caso de Rails es el componente ms importante. Ya que en este es donde
encontramos la meta programacin que automatiza la capacidad de las clases basndose
en el contenido de la estructura de la base de datos, y vamos a ver que con un mnimo
de configuracin podemos reducir cientos de lneas de cdigo de programacin a unas
pocas.
El Framework de Rails, manipula las tablas de la base de datos con los objetos del
Active Record, a su vez cada objeto tiene el llamado CRUD
66
, con este evita a que el
programador haga las acciones de creacin, listar, actualizar y el borrado de los datos de
las tablas.
El Active Records en Rails posee tres ideas revolucionarias a diferencia de otros
Frameworks, y estas son:
x Una convencin fuera de la configuracin
Con esta convencin Rails descubre todo lo relacionado con el esquema de la
base de datos, para la optimizacin del cdigo que se genere posteriormente.
x Meta programacin
Active record revisa de una manera automtica las caractersticas de la Base de
Datos y lo une con nuestro modelo, y genera cdigo para inserciones,
modificacin, visualizacin y eliminacin de los datos de nuestras tablas.

x Lenguaje de Mapeo
El Active Records utiliza a Ruby como un lenguaje dentro de un lenguaje, para
ver mejor esta idea, Rails crea un lenguaje de manipulacin de la base de datos a
travs del lenguaje Ruby.

4.2.2.1. Definicin del Modelo

La definicin del modelo en Rails, no es mas que realizar el esquema de nuestra base de
datos, un buen diseo de la BD nos va ha llevar a un buen programa, para esto tenemos
que seguir los criterios como la normalizacin de nuestra base.
Adems al momento de disear tenemos que tener en mente como van a estar
relacionadas nuestras tablas, Rails no tiene restricciones con las relaciones.

66
CRUD Create, Read, Update, and delete

4.2.2.2. Configuracin de Active Record

Dentro de la configuracin de Active record tenemos la creacin de la base de datos
como punto adicional ya que sin esa creacin es imposible la configuracin, en este
caso Rails no nos restringe en la utilizacin de una BD ya que podemos utilizar Oracle,
MySQL y algunas cuantas mas, pero en la instalacin predefinida solo viene el
controlador de MySQL
67
, y si deseamos utilizar otra base debemos descargar el
controlador e instarlo.
Despus de tener creada nuestra BD el siguiente paso que debemos realizar es la
configuracin de nuestra aplicacin para que utilice la misma. Para esto vamos al
directorio de la aplicacin, e ingresamos en la carpeta config, donde editamos el
archivo database.yml, esto se lo puede realizar dentro de cualquier editor de textos.
En este archivo vamos a encontrar tres tipos de conexiones desarrollo, prueba y
produccin, esto se debe a razones lgicas, ya que al momento de ir desarrollando no se
desea eliminar, modificar o insertar datos en una base que este ya en uso, como es la de
produccin, y la BD de prueba se crea para que en cada prueba que se elimnen y
generen nuevos datos, haciendo que cada base posea diferentes informacin.

67
MySQL es un sistema de gestin de base de datos relacional, multihilo y multiusuario con ms de seis
millones de instalaciones.

Figura 4.13. Archivo database.yml actualizado con la base de datos a utilizar.
Fuente. El Autor, 2008


Dentro de cada configuracin se tiene que dar los siguientes parmetros:
x Adapter
El controlador de la base de datos que vamos a utilizar.
x Database
La base de datos que se utilizar.
x Username y Pasword
El nombre y la clave de un usuario que exista en la base de datos, el cual debe
tener privilegios para insertar, modificar, eliminar y listar datos.
x Host
La direccin de donde se encuentra el servicio de la base de datos.

Se puede utilizar la misma BD para los tres tipos de conexiones, pero teniendo en
cuenta que los datos se van ha perder, se recomienda una BD para cada una o por lo
menos dos ya que la una se puede usar tanto en desarrollo como en la etapa de pruebas.

4.2.2.3. Migracin del esquema de la base de datos

El esquema de la base de datos se puede manejar de dos maneras, con la utilizacin de
un Script de SQL
68
y la utilizacin migraciones, la mejor opcin es crear una
migracin. La migracin es un concepto de Active Record que permite tener las
modificaciones al esquema de la base de datos sincronizada con la versin actual del
cdigo, esto sugiere un poco mas de trabajo, pero bien vale hacerlo ya que posee varias
ventajas hacerlo, una de ellas es modificar nuestro esquema sin perdida de datos
(sincronizacin de las tres bases de datos que se usan en Rails).
En versiones posteriores a Rails 1.0, la migracin ya viene activada por defecto, si se
utiliza una versin anterior se debe configurar, esto lo hacemos editando el archivo
environment.rb, de la carpeta config dentro de la aplicacin que desarrollemos. En este
archivo cambiamos y activamos el atributo active.record.schema.format ya que por
defecto viene como comentado, para configurar este atributo debemos escribir la
siguiente sentencia:

config.active_record.schema_format = :ruby


68
SQL es un lenguaje declarativo de acceso a bases de datos relacionales que permite especificar
diversos tipos de operaciones sobre las mismas.
Cuando activamos este atributo decimos que el esquema ser controlado por Ruby y
que los cambios de la BD van a utilizar el mtodo up y que para deshacer un cambio
va ha utilizar el mtodo down.
Para crear una migracin, se debe hacer lo siguiente:

Figura 4.14. Ejemplo de una migracin.
Fuente. El Autor, 2008

Al finalizar Rails nos crea una clase llamada createMascotas (dentro del archivo
002_create_mascotas.rb dentro de la direccin db/migratie), la cual contiene los
mtodos self.up y self.down, que como ya se explic van ha servir para realizar
cambios o para deshacerlos.

Figura 4.15. Clase Creacin Mascotas.
Fuente. El Autor, 2008

Para finalizar nuestra migracin definimos lo que debe realizar cada mtodo, el primero
va ha servir para creacin de tablas entonces definimos la tabla con un comando de
Ruby y en el mtodo self.down damos el deshacer que en este caso es eliminar las
tablas:


4.2.2.4. Convenciones

Rails utiliza algunas convenciones ya sea en sus clases, la manera de definir los
modelos , y como definir los atributos, en algunos de ellos debemos tener en claro como
definirlos ya que nos podrn dar errores por nombrarlos de una manera incorrecta, por
ejemplo en el caso de las tablas y sus modelos, la tabla debe estar su nombre en plural y
su modelo en nombre singular, caso contrario, no va interactuar, el modelo con el
elemento de la base a la cual hace referencia, ya que no lo encontrara.
x Clases y nombres de Tablas

Como se explic en el ejemplo Rails el nombre de las tablas de la BD deben
estar en plural, mientras que el nombre del modelo debe encontrarse en singular.

x Identificadores

x Primary Key

Rails busca una columna dentro de una tabla llamada Id, si la encuentra
automticamente la toma como su clave primaria, adems si esta columna es
numrica y se autoincrementa, Ruby sacar ventaja de estas caractersticas al
momento de crear el modelo, haciendo que en la vista tambin se
autoincremente este campo.

x Foreign keys

La convencin con los foreign keys, o referencia que se realiza a otra tabla se
hace de la siguiente forma, <nombreClase>_id, por ejemplo supongamos que
tenemos una tabla llamada mascot, y otra llamada vacunas, su relacin
debera ser mascotas_id.

x Nomenclatura de nombres

La manera con la que Ruby referencia a los nombres de los mtodos, clases,
columnas atributos y smbolos, es diferente como se encuentran en otros
lenguajes, para la separacin de un nombre que tenga mas de una palabra se usa
el guion bajo, por ejemplo si tuviramos detalle factura, el nombre de la clase es
detalle_factura, la principal razn es por esttica, pero es muy til al momento
de referirnos a diferentes objetos.

x Accesos
La meta programacin de Ruby, no crea mtodos para el acceso a cada atributo
de la base de datos, en vez de eso crea un solo mtodo estndar, el cual se adapta
dependiendo del atributo que utilicemos, el nombre del mtodo estndar es
method_missing el cual tiene escrito la accin determinada para los mtodos
inexistentes, un ejemplo de este mtodo es el siguiente.
def method_missing(method)
if method.to_s =~ /llamada_/
puts $'
end
end

Ahora cada vez que se llame a un mtodo que comience con llamada_ y este
no exista dentro de la clase, este ejecutara la accin que este dentro de if, que en
esta ocasin imprimir un mensaje en la consola.
De la misma manera realiza esta accin para las conexiones con la nica
diferencia que la accin no ser la de imprimir un mensaje, sino algo mas
complejo como la conexin a la base de datos.


x Columnas
La interaccin que poseen las tablas de la BD y las clases que manejan estas, se
crea bajo el active record, al momento en que una clase llama a una tabla este
devuelve un arreglo llamado @@columns, que el posee la informacin de la
tabla, el arreglo contempla la siguiente informacin:
Name:
El nombre de la columna.
Type
El tipo de dato con la cual Ruby puede trabajar.
Number
Si los datos de la columna son numricos devuelve una variable booleana true, si
no es numrica devolver false.
Limit
El tamao del dato mximo que puede contener esta columna.
Null
Si puede recibir un tipo de dato nulo, igual que el dato numrico devuelve un
true si es capaz de recibir nulos, en caso contrario devuelve false.
Text
Nos devuelve true o false dependiendo si los datos son de tipo texto o no.
Default
Muestra el valor por defecto que tiene la columna al momento que no se le de
ningn valor.
Primary
Es un booleano que muestra si la columna forma parte de la clave primaria de la
tabla, si es parte devuelve un valor true sino devuelve un false.
Esta informacin para Ruby on Rails es muy importante al momento de utilizar
el Scaffolding.


4.2.2.5. Clases Complejas

Una BD en la mayora de los casos no va ha estar compuesta por una sola tabla, sino por
varias y con sus diferentes relaciones, Rails por defecto ya considera cada una de estas
situaciones y diferentes maneras de tratar estas, a continuacin veremos algunas.
Beiencia
Ruby para trabajar con la herencia utiliza una estrategia llamada herencia a una tabla, la
cual permite utilizar una tabla de la BD para dos clases, la clase padre y la hijo (la cual
hereda los atributos de la clase padre), por ejemplo consideremos que tenemos una
clase llamada persona y otra que hereda sus atributos llamada fotgrafo, la mismas van
ha utilizar los mimos atributo exceptuando uno que es cmara, estas dos clases van ha
ser manejadas por una sola tabla llamada persona, para visualizar mejor este ejemplo
veamos la siguiente figura.















Figura 4.16. Utilizacin de Herencia
Fuente. El Autor, 2008

Active Record no necesita crear un soporte especial para las superclases, para la
creacin de subclases es importante tener el atributo Type, ya que con este el Active
Record reconocer automticamente al momento de declarar subclases, y como utilizar
estas. Por ejemplo:
La declaracin de la clase padre tiene que ser:
class Persona < ActiveRecord::Base
end
Y la declaracin de la subclase fotgrafo, se la realiza de la siguiente manera:
class fotografo < Persona
end


Tabla Persona


Atributos
ID
Nombre
Email
Cmara (Null)
Clase Persona


Atributos
ID
Nombre
Email
Cmara
Clase Fotgrafo
Como podemos ver al momento que damos < Persona esta clase hereda todos los
atributos de la clase padre.
Ahora si la clase persona tiene el atributo type, este se rellena dependiendo de la clase
que usemos, ya sea persona o fotgrafo este atributo se llena automticamente.
Relaciones
El Active Record de Ruby, puede manejar las relaciones comunes que existen en la base
de datos ya sea esta de uno a uno, de uno a muchos, o de muchos a muchos.













Figura 4.17. Ejemplo de relaciones.
Fuente. El Autor, 2008



Tabla Persona


Atributos
ID
Nombre
Email
Clase Persona

Atributos
Calle
Clase Direccin
4.2.2.6. Comportamientos

Active Record maneja diferentes tipos de transacciones y operacin que podemos
efectuar en los elementos de la base de datos, tenemos entre ellos una de las clases mas
importantes(la cual manejara los diferentes operaciones que se realizan a una fila de una
tabla), llamada ActiveRecord::Base.

Tiansacciones
En muchas aplicaciones necesitamos realizar una transaccin crtica, el ejemplo ms
comn tenemos la transferencia de dinero de una cuenta a otra, esto implica un debito y
un crdito, en Ruby un mtodo que controle este tipo de transaccin podra ser:

def transferencia(from, to, cantidad)
from.debito(cantidad)
to.credito(cantidad)
end

El problema sera cuando ocurriera algn inconveniente al momento de realizar esta
transaccin, en el caso que debitemos y no se acredita a la otra cuenta, se pierde el
dinero, el otro caso seria si acreditamos y todava no debitamos, la compaa perdera el
dinero. Estos dos casos son crticos y existen muchos casos de igual ndole. Pero para
este tipo de circunstancias Active Record a implementado en todas sus clases un
mtodo capaz de comprobar si se ha llevado a cabo el 100% de la transaccin, si en
caso contrario no se ejecut por completo, regresara al estado anterior de realizar esta
transaccin, este mtodo se llama transaction a continuacin veremos como se
implementa:
def transferencia (from, to, cantidad)
cuenta.transaction do
from.debito(cantidad)
to.credito(cantidad)
end
end

Como pudimos darnos cuenta el mtodo transaction es llamado antes de todas la
acciones criticas que tengamos, si acaso fallara una, simplemente regresara al estado
anterior, de esta manera ganamos una integridad en todas nuestras transacciones.

Bsqueuas
Como ya se haba explicado en algunas partes, Rails puede controlar nuestra BD, y
por supuesto todos los elementos almacenados en ella, en el caso de bsquedas, hace
hincapi a que podemos encontrar cualquier dato almacenado, pero adems despus de
encontrarlo podemos manipularlo.
En el caso de bsquedas podemos visualizar todos los datos que tenemos en cierta tabla
para esto utilizamos el mtodo find_all.


Figura 4.18. Ejecucin del comando find_all
Fuente. El Autor, 2008


El mtodo find_all nos devuelve todos los datos, cuando lo usamos en el promt no se
encuentra mucho sentido utilizarlo ya que no podemos entender nada, pero todos estos
datos los podemos almacenar dentro de una variable para su posterior visualizacin en
nuestra aplicacin.

Podemos tambin realizar consultas mas elaboradas como encontrar un dato en especial
de la tabla, en este caso utilizaremos el mtodo find_by_nombreDelaColumna. En este
mtodo enviamos el dato que deseamos encontrar, e internamente ste se encargar de
realizar la respectiva consulta para encontrarlo, por ejemplo tomemos a nuestra tabla
mascota y que deseamos encontrar a la mascota llamada Boby.


Figura 4.19. Ejemplo de una bsqueda referente a un nombre
Fuente. El Autor, 2008


Luego de tener encontrado nuestro dato lo podemos manipular, en el caso que deseemos
eliminar el dato podemos ejecutar el mtodo delete o destroy, ambos pueden eliminar
los elementos pero a diferencia del delete, destroy fuerza la eliminacin, mientras que
el otro si encuentra algn problema esta operacin no se ejecuta.

El ltimo mtodo que podemos utilizar dentro de las bsquedas es el modificar, el cual
nos permite actualizar los datos encontrados, por ejemplo:

Figura 4.20. Ejemplo de utilizacin del mtodo update
Fuente. El Autor, 2008


Como pudimos notar el primer paso es poner el resultado de la consulta dentro de una
variable, despus vamos modificando cada uno de los atributos, y al final llamamos al
mtodo update.

valiuaciones
En todas las aplicaciones necesitamos tener un mtodo que nos permita ingresar los
datos validos o permitidos en nuestra aplicacin, para as evitar errores como nombres
vacos, diferentes tipos de datos a los permitidos, etc.

Para el control de los datos, Rails ha implementado un mtodo de validacin, este
permite crear los diferentes tipos de control en pocas lneas, a continuacin se ir
explicando los diferentes tipos de validaciones que se pueden realizar. Estas
validaciones las debemos realizar dentro de el archivo de modelo de cada objeto.

x Campos vacos.

validates_presence_of :<nombre del campo>

Por ejemplo, en la calase mascota deseamos que el nombre de esta no pueda ser
vaca.


Figura 4.21. Archivo del modelo de la clase Mascota.
Fuente. El Autor, 2008


Despus de poner esta lnea y guardar, la validacin se est realizando y esto
podemos comprobarlo en el promt, aunque, como se ver que este tipo de
validaciones sirven en cualquier interfaz.

Figura 4.22. Utilizacin de la validacin de campos vacios.
Fuente. El Autor, 2008


x Formato
validates_format_of : <nombre del campo>, :with =><atributos al campo>

Ejemplo:

La validacin del campo de una direccin email: este necesita tener el formato
<usuario>@<proveedor>, para lo que designamos lo siguiente:

validates_format_of :email,
:with => /^([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})$/i



x Tamao de campos

validates_length_of :<nombre del campo>, :within => Tamao Minimo..Tamao
Maximo

Ejemplo:
Uno nombre no puede ser menor de 2 caracteres y tampoco mayor a 20
caracteres.

validates_length_of :nombre, :within => 2..20


Este tipo de validaciones funcionan con cualquier interfaz en la que se encuentre.


4.2.3. Relaciones de Active Record

El Active Record de Rails toma la ventaja del lenguaje Ruby y su manera de manejar
las convenciones y de simplificar el acceso y configuracin a los datos. Una relacin es
especificada por tres componentes los cuales son:

x Relacin

El comportamiento de la relacin se maneja con el mtodo ActiveRecord::Base.

x Asociacin

Es la especificacin de el tipo de la relacin que va ha poseer, esto se lo realiza
mediante un smbolo pudiendo ser este plural o singular dependiendo de la
cardinalidad del objeto de relacin.

x Parmetros

Cada relacin puede tener un determinado nmero de parmetros, los cuales
servirn para tener control de esta.

Una relacin puede ser definida de la siguiente manera:

relationship :association :parameter1 => value, :parameter2 => value,...

4.2.3.1. Correspondencia

belongsto
Este mtodo corresponde a la relacin en las tablas de uno a muchos, este mtodo se
utiliza dentro del modelo de la tabla detalle, con el nombre de la tabla maestro, haciendo
que todos los datos del maestro a la que se refiere al detalle estn dentro de la misma.
Por ejemplo:
Supongamos que poseemos dos tablas, una llamada Mascotas y otra Vacunas, ya que
una mascota puede tener varias vacunas, existe una relacin de uno a muchos, como se
puede ver en el grfico.








Figura 4.23. Ejemplo de relacin uno a muchos dentro de la BD.
Fuente. El Autor, 2008

La creacin de la base de datos se la puede realizar por medio de la migracin, o con los
mtodos comunes como el SQL, lo nico que se debe tener en cuenta es el Foreing
key
69
que como se explic en la parte de nomenclaturas, tiene que ser de la forma
<nombredelaTablaMaestra>_id, ya que si no se encuentra de esta manera Rails no lo
podr reconocer.

69
Clave de referencia hacia otra tabla de la misma BD.

Base de Datos
Tabla Mascota
Id
1
2
Nombre
Bobi
Brandon
Propietario
Byron
Mayra
Especie
Canina
Canina

Vacunas
Id Fecha Tipo
1 122007 Rabia
2 012006 Rabia
Luego de tener creada nuestra base de datos, creamos un modelo para cada tabla, ya que
en ejemplos anteriores hemos usado Mascota, su modelo ya ha sido creado, entonces
solo creamos el de vacunas.
ruby script/generate model vacuna
Despus haber creado el modelo lo modificamos, e ingresamos los siguientes datos
belongs_to :mascota, de esta manera le indicamos que su clase maestra es mascota.

Figura 4.24. Modelo de vacuna.
Fuente. El Autor, 2008


Por ltimo para comprobar si la relacin esta funcionando realizamos lo siguiente.
Vac=Vacuna.find 1
Vac.mascota.nombre
Al momento en que ejecutamos esos comandos la consola de Ruby nos devolver el
nombre de la mascota que se puso la vacuna numero 1.


Figura 4.25. Verificacin de belongs_to.
Fuente. El Autor, 2008


hasmany
En una relacin de uno a muchos, existen dos tablas: la maestro y su detalle, como
vimos anteriormente para que cada detalle tenga los datos de su maestro utilizamos
belongs_to, ahora para conocer todos las filas relacionadas de la tabla detalle a su
maestro utilizamos el has_many. Por ejemplo.

La relacin que se tenia entre mascota y vacunas, una mascota va ha tener varios tipos
de vacunas, y si utilizamos has_many al momento de llamar una mascota, tambin
podemos acceder a todas las vacunas que este a tenido.

Figura 4.26. Modelo de Mascota.
Fuente. El Autor, 2008


Para visualizar este ejemplo, vamos ala consola y revisamos los datos de la primera
mascota.

Figura 4.27. Visualizacin de tipos de vacunas recibidas por la mascota.
Fuente. El Autor, 2008

4.2.3.1.2.1. Borrado en cascada

Tambin tenemos varias acciones que podemos realizar a esta relacin, podemos ver
unas de estas acciones en la Tabla ----, por ejemplo si deseamos que la relacin sea de
tipo cascada utilizamos el atributo dependent y le damos el valor true.

has_many :Vacunas, :dependent=> true



Caracterstica Descripcin
Mtodos
<associations><<object Aadimos un objeto a la asociacin.
Mascota.Vacunas << nueva_mascota
<associations>.delete object Elimina un objeto de la relacin.
Mascota.delete mascota_Borrar
<associations>_singular_ids
Collection
Remplaza los ids de la tabla vacunas:
vacunas_singular_ids [1, 2, 3, 4]

<associations>.find Busca en la tabla detalle, dependiendo de la bsqueda.
Vacunas.find 1
<associations>.clear Elimina todos lo elementos.
Vacunas.clear
<associations>.empty?
<associations>.size Devuelve el numero de filas que pertenecen a la clase
maestra.
<associations>.build Crea un nuevo objeto.
Vacunas.build(nombre =>AntiRabica)
Atributos
<associations> Una coleccin de asociaciones de los objetos.
Tabla 4.2. Metaprogramacion para el has_many
Fuente. Ruby on Rails: Up and Running


hasone
Este hace referente a la relacin uno a uno, igual que los anteriores dos, lo
implementados dentro de un modelo, de la siguiente manera.
class Mascota < ActiveRecord::Base
has_one :Fotografia
...
end

Como se muestra en el anterior ejemplo se pone la clase a la que se hace la relacin, en
este caso vamos a tener una fotografa por cada mascota, de esta manera existe la
relacin uno a uno.

hasanubelongstomany
La ultima relacin que es frecuentemente utilizada es la de muchos a muchos, para la
cual utilizamos has_and_belongs_to_many, como se conoce dentro de la BD, este tipo
de relacin crea una tercera tabla que contiene las claves primarias de las tablas
relacionadas, por otra parte en la parte lgica esta relacin solo creara dos clases, para
apreciar mejor esta idea veamos el siguiente grfico.














s
Base de Datos
Campaas
Id Nombre Fecha
1 Guayas 06/2005
2 Sanidad 09/2006
Vacunas
Id Nombre Enf.
1 Drixonil Rabia
2 Penteral Rabia
Vac Cam
Id_V Id_C
1 1
1 2
2 1






Atributos
ID
Nombre
Enfermedad
Clase Vacunas


Atributos
ID
Nombre
Fecha
Clase Campaas


Figura 4.28. Relacin de muchos a muchos.
Fuente. El Autor, 2008

Como se aprecia en la figura podemos ver que solo en la BD, se crea una tabla
intermedia, mientras que en la parte lgica no, este vnculo solo existe como atributo de
la misma. Ahora en la implementacin de Rails tenemos que crear las tres tablas, la
tabla intermedia por convencin tiene que llamarse uniendo los dos nombres,
separndolo cada uno por un guin bajo, por ejemplo Vacunas_Campaas.
Para la utilizacin de has_and_belongs_to_many, creamos los modelos de las tablas
principales. Tomando el ejemplo presentado sera Vacunas y Campaas, luego de esto
colocamos este atributo dentro.


Figura 4.29. Modificacin de los modelos Campanas y vacunas
Fuente. El Autor, 2008


Como se puede apreciar, la referencia a la relacin muchos a muchos se crea en ambos
modelos, de esta manera Ruby crea la relacin con la clase intermedia. Para comprobar
si la relacin esta funcionando vamos a la consola y visualizamos los datos.
Figura 4.30. Prueba del funcionamiento del comando has_and_belongs_to_many
Fuente. El Autor, 2008



4.2.4. Scaffolding

Rails proporciona un mtodo automtico para la creacin de las pantallas de crear,
modificar, listar y eliminar los datos, y esto lo hace utilizando una lnea de cdigo. Por
supuesto estas interfaces no sern las finales ya que como son generadas estas carecen
de un buen diseo, y adems puede estar incompleta respecto a lo que desee el usuario.
Algunos beneficios de utilizar el Scaffolding o andamiaje son las siguientes:
x Se puede tener un cdigo ya funcional, en donde
podemos iniciar nuestra aplicacin.
x Se construye las aplicaciones de una manera ms
rpida, se puede lograr mucho con una sola lnea de cdigo.
x Podemos utilizar la metaprogramacin para realizar
actualizacin de nuestra BD automticamente.
x El Scaffolding es dinmico y tenemos libertad en la
creacin del esquema de la BD, y sus interfaces.
x Podemos modificar los mtodos creados por el
Scaffolding, sin afectar a los dems.
4.2.4.1. Uso de Scaffolding

Anteriormente los ejemplos usados lo realizbamos dentro de la consola de Ruby,
como vimos su interfaz era de bajo nivel, con el uso de Scaffolding veremos ya nuestra
aplicacin basada en la Web. De una manera muy rpida y sencilla podremos realizar
las acciones principales que se ejecuta en nuestra base de datos.
Para comenzar a construir el Scaffolding, se debe construir cada uno de los
controladores de las diferentes tablas que se van ha utilizar, para su posterior edicin y
colocacin del mtodo Scaffolding, por ejemplo:
Sigamos con nuestra pequea aplicacin, solo que esta vez la desarrollaremos de una
manera un poco ms exhaustiva, nuestra BD, va ha ser de la siguiente manera:







Figura 4.31. Base de datos de ejemplo para el Scaffolding
Fuente. El Autor, 2008

Ya que tenamos creado el controlador de mascota, solo agregamos de las tablas que
nos faltan, las cuales son propietario y vacunas:
ruby script/generate control propietario
ruby script/generate control vacuna
Luego de crear los controladores lo nico que nos falta es editarlos, y poner dentro de
cada uno de ellos el mtodo de Scaffolding, este mtodo se lo usa de la siguiente
manera:
scaffolding :<Nombre>
En el atributo nombre se utiliza la tabla a la cual se va ha relacionar, pero como estamos
dentro de Ruby este nombre debe estar en singular, por ejemplo si la tabla es la de
vacunas su nombre seria vacuna.


Base de Datos
Vacunas
Id Nombre fecha
1 Antirab 06/2005

Propietarios
Id Nombre Apel
1 Andrs Guac
2 Gloria Fare
Mascotas
Id Nombre tipo
1 Boby Cani
2 Lili Ave

Figura 4.32. Controlador de Vacuna con el mtodo Scaffolding
Fuente. El Autor, 2008

Con esta lnea de cdigo estamos diciendo que utilice el mtodo Scaffolding, para esta
tabla, y a su vez este genera los mtodos de creacin, modificado, eliminacin, y listado
de la misma, despus de guardar este cambio y hacer correr el servidor Web , podemos
ver cada uno de las interfaces creadas automticamente:

Figura 4.33. Interfaces creadas automticamente por el Scaffolding.
Fuente. El Autor, 2008

Los diferentes mtodos que se crean a la hora de poner el comando Scaffolding, se
listan en la siguiente tabla:
Nombre Propsito
ndex Da una pgina de bienvenida, por defecto esta es la misma que list.
new Visualiza la pgina para crear un nuevo elemento en la tabla.
Update(id) Devuelve la interfaz para la modificacin de un dato guardado en la tabla.
List Lista todos lo elementos guardados en la tabla, adems nuestra las acciones
posibles con estos.
Destroy(id) Elimina un elemento de la BD, especificado por el atributo id.
Edit(id) Sirve para modificar los datos de un elemento de la tabla BD.
Show(id) Muestra todos los atributos del elemento.
create(target) Crea y guarda un objeto del Active Record a un objeto designado.
render_scaffolding Es la vista default al momento de no encontrar la pgina buscada.
Tabla 4.3. Mtodos creados por el Scaffolding
Fuente. El Autor, 2008


4.2.4.2. Generacin de cdigo Scaffolding

Es la otra manera de creacin del Scaffolding, esto es bajo el comando ruby
script/generate scaffold, este comando posee algunos parmetros, que nos servirn para
la manipulacin y control del Scaffolding.
Para utilizar este comando necesitamos especificar un nombre del modelo y uno para el
controlador, aunque el del controlador es opcional, ya que especificando el nombre que
se le va a dar al modelo el controlador se crear con el nombre en plural de este, el
formato del comando es el siguiente:

ruby script/generate scaffold <Nombre del modelo> [nombre del controlador]
[acciones,]

Un ejemplo de este comando, seria utilizarlo en la tabla Propietario, en este caso no
vamos a especificar su controlador, lo que nos dar por resultado es la creacin de este,
con el nombre del modelo en plural.



Figura 4.34. Utilizacin del comando Scaffolding.
Fuente. El Autor, 2008


4.2.4.3. Reemplazo de Scaffolding

Rails no es restrictivo al momento de manipular cualquier mtodo que se haya
generado, en el caso del Scaffolding, si deseamos manipularlos debemos poseer estos,
si utilizamos el comando scaffold todos los diferentes mtodos se van ha encontrar ya
escritos, pero si utilizamos el otro mtodo debemos especificar los que vayamos a
manipular.
Un ejemplo del archivo con los mtodos listos para manipularlos, es el siguiente, el cual
fue generado en el ejemplo anterior con el scaffold.

Figura 4.35. Mtodos dentro del Scaffolding
Fuente. El Autor, 2008


Adems del modelo y el controlador, podemos modificar cada una de las vistas, de
esta manera podemos darle un mejor diseo y mejorar un poco la interfaz.

4.2.5. Diseo de Pginas

Hasta ahora se ha trabajado con las interfaces generadas con el scaffolding, estas pueden
resultar de apariencia muy simple, y con servicios bsicos, Rails nos da la facultad de
editarlas e irlas mejorando hasta satisfacer las necesidades de los usuarios.
En esta parte veremos como podemos reemplazar las interfaces generadas y dar un
mejor aspecto,, adems de darles mejores servicios(ya sea utilizando el lenguaje HTML,
plantillas, estilos, etc.).
1. El servidor Web recibe una peticin por el
explorador.
2. El servidor Web normalmente esconfigurado con
recursos estticos
3. Si no existe en el servidor un recurso esttico, se llama
a Rails
4. Despus de esto se el enva la peticin a Rails, este
enva al controlador y revisa que accin va ha realizar.
4.2.5.1. Plantillas

Podemos modificar las plantillas generadas por el scaffolding, buscando estos archivos
dentro de la carpeta views del proyecto, los archivos generados son de extensin rhtml,
el cdigo dentro de cada archivo posee cdigo ERb (Embedded Ruby), donde utiliza
dentro de la plantillas de HTML cdigo de Ruby. El cdigo de Ruby se encuentra
entre <% y %>, al momento de hacer una llamada al servidor de una pgina con este
tipo de cdigo, el servidor se encarga de ejecutarlo y generar la interface con el cdigo
HTML.
Por ejemplo para mostrar una fotografa de una mascota al momento de mostrar sus
datos realizamos lo siguiente:
1. Creamos una instancia de la Mascota, para utilizar al
momento de visualizar los datos, esto lo realizamos dentro del controlador, y su
mtodo show, si no existe este mtodo lo creamos.

Figura 4.36. Instancia de Mascota dentro del mtodo Show
Fuente. El Autor, 2008

2. Luego de esto vamos a app/views/Mascota y
modificamos el archivo show.rhtml, si este archivo no existe simplemente lo
creamos y editamos con el siguiente cdigo:

<h1>Mascota</h1>
<%= image_tag 'mascotas/Boby.jpg' %>
<p><b>Nombre: </b><%= @mascota.nombre%></p>
<p><b>Especie: </b><%= @mascota.especie%></p>
<p><b>Sexo: </b><%= @mascota.sexo%></p>
<p><b>Fecha de Nacimiento: </b><%= @mascota.nacimiento%></p>
<p><b>Fecha de Fallecimiento: </b><%= @mascota.fallecimiento%></p>
<%= link_to 'Editar', :action => 'edit', :id => @propietario %> |
<%= link_to 'Regresar', :action => 'list' %>

3. Lo guardamos y ya podemos ver los resultados, las
imgenes que se van ha utilizar en el proyecto, tienen que encontrarse dentro de
la direccin public/images, esta se encuentra en el directorio raz del proyecto.

Figura 4.37. Vista de Mascota con imgenes
Fuente. El Autor, 2008

Como se puede ver en el paso 2, el cdigo es una mezcla de HTML con cdigo de
Ruby, de esta manera hemos mejorado un poco la interfaz de nuestra aplicacin de
prueba. Esto lo podemos aplicar para cada interfaz que poseamos.
Plantillas ueneiales
Como podamos ver dentro de los archivos de la carpeta vistas, no se encuentran los
elementos de una pgina Web, como la cabecera y el cuerpo, en vez de eso Rails utiliza
un archivo que toma como esquema de una plantilla, donde se encuentran todos los
elementos de la pgina. Esta pagina se encuentra dentro de views/layouts, donde cada
controlador posee su propia plantilla.
Durante la ejecucin de la aplicacin, la lnea <%= @content_for_layout %> es
reemplazada por todo el cdigo que se ha creado en la vista, este archivo de plantilla lo
podemos manipular de manera que modifiquemos la interfaz de todas las vistas que
utilizan esta plantilla, por ejemplo, si colocamos una barra de navegacin dentro de la
plantilla de Mascota, esto se lo realiza con el siguiente cdigo:
<div style="background-color:LightBlue">
<p>
<%= link_to 'Mascotas', :controller => 'mascota', :action => 'list' %>
<%= link_to 'Vacunas', :controller => 'vacuna', :action => 'list' %>
&nbsp;
<%= link_to 'Propietarios', :controller => 'propietarios', :action => 'list' %>
</p>
</div>
Este cdigo se lo coloca dentro del body, en la parte que deseemos que aparezca, luego
de colocar el cdigo este aparecer en todas sus acciones, como en listar, nuevo,
modificar, etc.

Figura 4.38. Utilizacin de la plantilla estndar, para el controlador Mascota.
Fuente. El Autor, 2008

El Standard creado slo funcionar para el controlador seleccionado, si deseamos que
funcione para cualquier pagina el diseo que creamos debemos realizar los siguientes
pasos.
1. Editar el archivo application.rb, que se encuentra
dentro de la carpeta de los controladores, a este le colocamos el atributo layout
'standard'.

Figura 4.39. Archivo application.rb
Fuente. El Autor, 2008


2. Ahora dentro de apps\views\layouts creamos el
archivo Standard.rhtml, y creamos la plantilla que deseemos que posean todas
las vistas.

Figura 4.40. Archivo Standard.rhtml
Fuente. El Autor, 2008


3. Por ltimo, eliminamos los archivos de la carpeta
layout, exceptuando Standard.rthml y los de las vistas que requieren ser
diferentes.
De esta manera cualquier pgina que no se haya creado una plantilla tomar por defecto
la Standard, con esto ahorramos tiempo en el diseo de cada plantilla.

4.2.5.2. Uso de Estilos

El uso de Estilos es una herramienta muy utilizada al realizar las aplicaciones Web, de
esta manera ahorramos tiempo en la mejora de las interfaces. Un estilo es lenguaje
formal usado para definir la presentacin de un documento estructurado escrito en
HTML o XML.
Para esto podemos crear nuestro propio archivo de estilos con extensin CSS, o
modificar el generado scaffold.css, en cualquiera de los dos casos estos se deben crea
en la carpeta
public/stylesheets, Por ejemplo creemos un estilo para mascotas, este se llamar
mascota.css, y contendr lo siguiente:
body { background-color: #BAC06B; color: #333; }
body, p, ol, ul, td {
font-family: verdana, arial, helvetica, sans-serif;
font-size: 13px;
line-height: 18px;
}
Ahora lo aplicamos a nuestro proyecto editando el archivo Standard.rhtml, y colocando
el uso de este en su cabecera.

<%= stylesheet_link_tag 'Mascota' %>

Despus de esto podemos ver aplicado nuestro estilo entrando a cualquier vista en la
que se encuentre aplicado el estndar.

4.2.5.3. Pagina Raz

La interfaz principal por defecto es una pgina llamada index.html, esta se encuentra en
la carpeta public, nosotros podemos modificarla y colocar los vnculos hacia nuestras
diferentes interfaces, pero tambin podemos especificar que comience con cualquier
vista creada por nosotros.
Para la modificacin de la pgina que se cargar al entrar a nuestra pgina vamos a
config/routes.rb, y editamos el atributo:

# map.connect '', :controller => "welcome"

Y le damos nuestra pgina de inicio como default:


map.connect '', :controller => "mascota", :action => "list"

De esta manera cada vez que ingresemos a nuestra direccin raz, nos direccionara a la
lista de mascotas.

4.2.6. Ajax

Ajax o Asynchronous JavaScript and XML, se ha vuelto una de las tendencias ms
importantes del mundo, en lo que son las aplicaciones Web, ya que es una tcnica para
construir aplicaciones Web, con mas interactividad y dinamismo

Rails permite crear aplicaciones usando Ajax de una manera simple, ya que este
cdigo es generado por el propio Rails, y como es comn, nos brinda la posibilidad
detener un manejo del cdigo generado, de tal manera, que podamos especificarlo a
nuestras necesidades.



4.1.1.1. Como Rails implementa Ajax

Este tipo de implementacin, consiste en nuestras aplicaciones con operaciones de tipo
Ajax, las cuales al momento de llamar al servidor no crean una nueva pgina, si no lo
que realiza es recargar slo cierta parte de la misma. Para aclarar un poco ms esta idea,
se explicar con detalle como se realiza esta accin:
1. Se carga una pgina que contenga, algunos triggers de
tipo Ajax, estos pueden ejecutarse la momento realizar una accin en la pgina
como puede ser presionando un botn, o espera por un lapso de tiempo.

2. Luego que suceda la accin del trigger este llamar al servidor, enviando los
datos asociados a la accin, esto se lo maneja con un mtodo de JavaScript
llamado XMLHttpRequest.

3. Al llegar estos datos al servidor este internamente
enva al controlador y se ver que accin ejecutar, si es necesario este enviar un
fragmento de HTML.

4. Y para finalizar, si el servidor enva un fragmento de
HTML, el JavaScript del cliente lo recibe y actualiza una parte especifica con
este fragmento.

Para realizar todo esto Rails utiliza un prototipo y una librera de JavaScript, pero
tambin podemos implementar independientemente la parte de Ajax, si lo deseamos.
0so uel linktoiemote
Rails posee muchos mtodos que nos ayudan para implementar Ajax en nuestras vistas,
este es el caso de link_to_remote (), cada vez que se llama a este mtodo este ejecuta
una accin antes determinada, y recarga una parte especifica, por ejemplo.
En nuestro caso mascota, supongamos que deseemos en el momento de ingresar una
nueva vacuna a esta se listen debajo todas las vacunas que ya tiene, de esta manera no
podremos equivocarnos de ingresar dos veces la misma vacuna.
Para ello lo primero vamos al archivo vacuna.rhtm, dentro de la carpeta layouts de las
vistas, el prototipo lo colocamos en la cabecera y la librera que se utilizara es el
mtodo link_to_remote.

<html>
<head>
<meta http-equiv="content-type" content="text/html;charset=UTF-8" />
<title>Propietarios: <%= controller.action_name %></title>
<%= stylesheet_link_tag 'scaffold' %>
<%= javascript_include_tag "prototype" %>
</head>
<body>
<p style="color: green"><%= flash[:notice] %></p>
<%= yield %>
<div id="lista_Div">
<%= link_to_remote( "Actualizar",:update => "lista_Div",:url =>{ :action
=> :'list' },:position => "bottom.top" ) %>
</div>
</body>
</html>

De esta manera el ejemplo ejecutar cada vez que demos en al link actualizar, el mtodo
list, y lo colocar en la parte superior de la lista vieja.

Figura 4.41. Ejemplo de link_to_remote
Fuente. El Autor, 2008


4.2.7. Pruebas

Como ya hemos visto los programas realizados en Ruby no se compilan, como en
otros lenguajes de manera que no podemos ver los errores hasta el momento de
ejecucin. Sin embargo Rails crea automticamente el recurso llamado test (o
pruebas), este modulo fue diseado de tal manera que todas las aplicaciones que se
realicen en Rails sean probadas.
Aunque se crea una prueba automticamente cuando se ejecuta la aplicacin, para
mejorar la calidad y fiabilidad, debemos realizar las pruebas antes de ejecutar. Rails
anima a realizar pruebas de diferente ndole, ya que cada vez se ejecuta un comando de
ruby script/ se crea un modulo de pruebas. Adems de que por defecto al inicializar un
proyecto debemos crear una BD de pruebas promoviendo as tener datos de pruebas
para cada proyecto.

4.2.7.1. Unidad de Pruebas de Ruby

Una caracterstica de Ruby es el uso de pruebas con la clase Test :: Unit, que se
implementa para realizar las siguientes, pruebas:
x Tenemos una suite de pruebas, la cual contiene todas
las clases de casos de pruebas, cuando ejecutamos esta verificar cada uno de
los casos de prueba.

o Una clase de caso de prueba la cual es una subclase
de Test::Unit::TestCase, que posee una coleccin de mtodos heredados
para probar la funcionalidad de la aplicacin.

Un mtodo de prueba, estos mtodos por lo general
comienzan con el nombre test_, estas contienen a las aserciones,
y sirven para probar una pequea parte de la aplicacin.

x Una asercin, con la cual se evala una expresin,
dndole un valor esperado.


Al momento que nosotros ejecutamos una clase de prueba, esta llama a la suite de
pruebas, la cual ira ejecutando en forma jerrquica cada prueba que exista en esta.
La clase Test:: Unit, posee varias aserciones o mtodos para las pruebas, dependiendo
de la prueba que se desee, se implementa un mtodo de la clase, a continuacin se
muestra la tabla con todos estos mtodos.
Asercin Descripcin
assert( boolean, [msg] )

Evala si boolean es true

assert_equal( expected, actual, [msg] )

assert_not_equal( expected, actual, [msg] )



Evala si expected == actual

assert_match( pattern, string, [msg] )

assert_no_match( pattern, string, [msg] )



Examina si el string =~ pattern

assert_nil( object, [msg] )

assert_not_nil( object, [msg] )


Revisa si el object == nil

assert_instance_of( class, object, [msg] )

assert_kind_of( class, object, [msg] )


Evala si object.class == class

Examina si object.kind_of?(class)

assert_raise( Exception, ... ) {block}

assert_nothing_raised( Exception, ...) {block}


Revisa si el bloque ejecuta una excepcin listada.
Tabla 4.4. Mtodos comunes en la clase Test::Unit
Fuente. Ruby on Rails: Up and Running


4.2.7.2. Pruebas en Rails

Rails incluye dentro de la Test::Unit aserciones para la utilizacin en aplicaciones Web,
para esto implementa un tipo de prueba para las diferentes partes del Modelo MVC:
x Unidad de pruebas que se utiliza en el modelo.
x Pruebas de funcionalidad que se usan en los
controladores.
x Y la prueba de integracin la cual abarca las vistas.
Cada prueba se va generando dentro de la carpeta correspondiente en el directorio test
del proyecto, adems de estos tres tipos de pruebas podemos encontrar una carpeta
llamada fixture, la cual contiene los datos que se utilizarn en las pruebas.
Fixtuies
En el momento en que realizamos una prueba todos los datos de la BD, son eliminados
y se cargan los que se encuentran en la carpeta fixtures, esta carpeta contiene archivos
para cada tabla que poseamos, y pueden estar en dos tipos de formato el CSV
70
o el
YAML
71
.
El formato que se encuentra predefinido es el YAML, ya que es simple de interpretar.
En formato CSV se utiliza en caso que deseemos exportar los datos que estaban en la
BD, ya que es un formato muy utilizado en estos casos.
Por ejemplo para el caso que deseemos ingresar los datos en la tabla Mascota, esto lo
realizamos con el archivo mascotas.yml, y los datos deben ingresarse de la siguiente
manera:
primero:
nombre: Boby
especie: Canina
sexo: M
nacimiento: 2005-04-01
fallecimiento: 2006-06-01
propietario_id: 1
segundo:
nombre: Lili
especie: Ave
sexo: F

70
Comma separate value son un tipo de documento sencillo para representar datos en forma de tabla,
en las que las columnas se separan por comas (o punto y coma en donde la coma es el separador
decimal: Espaa, Francia, Italia...)
71
YAML Aint Markup Language es un formato de serializacin de datos legible por humanos
inspirado en lenguajes como XML, C, Python, Perl,

nacimiento: 2007-04-01
fallecimiento: null
propietario_id: 1

La primera lnea que se le da a cada ingreso de datos, es un nombre del fixture, en este
caso primero y segundo, a continuacin se le da el nombre de la columna seguido del
dato que deseamos que contenga.
Piuebas uel mouelo
Estos tipos de pruebas se encuentran en /test/unit, y se encuentran de acuerdo al nombre
de cada modelo que estamos utilizando en nuestra aplicacin, para correr este tipo de
prueba debemos ejecutar el comando:
rake test:units

Dentro del archivo podemos ir modificndolo hasta que cumpla las exigencias de la
prueba, tomando en cuenta que cada asercin que creemos tiene que comenzar con
test_, como muestra tomemos el caso que durante la prueba queremos contar el numero
de datos ingresado, nuestra confirmacin va ha ser que exista 5, en caso contrario nos
va ha devolver un error.


Figura 4.42. Clase de prueba de unidad de Mascota
Fuente. El Autor, 2008


Ahora ejecutamos el comando rake y nos devolver:

Figura 4.43. Ejecucin de la prueba de unidad.
Fuente. El Autor, 2008


Como podemos darnos cuenta, nos devuelve la prueba completada, dando como
resultado una falla, la cual es el nmero de mascotas, ya que sta esperaba tener
ingresada 5 mascotas y solo encontr 2.

De esta manera podemos realizar mas pruebas. Ahora podemos tambin realizar una
prueba de tipo CRUD
72
, para ello colocamos un mtodo de la siguiente forma.

def test_mascota_crud
# creamos una nueva mascota
mas = Mascota.new
mas.nombre = 'Chiripa'
mas.especie = 'Caninca'
mas.sexo = 'F'
mas.nacimiento = DateTime.now
# Guardamos dentro de la base de datos
assert mas.save
# Recuperamos la mascota
assert_not_nil mas2 = Mascota.find(mas.id)
# Vemos si al momento de guardar no ha cambiado los datos
assert_equal mas, mas2
# Actualizamos un dato de mascota
mas2.fallecimiento = '2007-08-08'
assert cat2.save
# Eliminamos el dato que creamos
assert mas2.destroy
end
Ejecutamos de Nuevo nuestra prueba, y si el modelo satisface la prueba nos indicar
que no ocurri ninguna falla.

72
CRUD Create, Read, Update, and delete
Piuebas Funcionales
Estos tipos de prueba dan cabida a la funcionalidad de nuestros controladores, es una
parte muy importante, ya que estos son los que decidirn la accin que se realizar al
momento que llegue una peticin al servidor.
Cuando se crea un controlador con el scaffolding , se genera automticamente un
archivo de prueba de funcionalidad completo para las pruebas de este controlador, este
archivo lo podemos encontrar dentro de la carpeta funcional del directorio de pruebas.

Figura 4.44. Archivo de Pruebas generado por el scaffolding.
Fuente. El Autor, 2008

Este archivo cubre todas las pruebas para las operaciones CRUD, para correr esta
prueba ejecutamos el comando rake text:functionals, al ejecutar este comando es
posible que nos devuelva varios errores, ya que este se genera con la primera base de
datos, y no con la que se actualiz en el transcurso de desarrollo.

Piuebas ue Integiacion
Estas pruebas son entre las acciones de las aplicaciones y los controladores, para correr
esta prueba debemos dar el comando rake test:integratation, este tipo de pruebas esta
basado en la utilizacin de las pginas por un nuevo usuario, o el registro del mismo,
adems que nos ayudan a encontrar bugs en nuestra aplicacin.
Para crear este tipo de pruebas vamos al directorio integration, y creamos los archivos
de pruebas que deseemos, por ejemplo si deseamos hacer la prueba de un nuevo usuario
creamos el archivo con el siguiente cdigo:
require "#{File.dirname(__FILE__)}/../test_helper"
class UserManagementTest < ActionController::IntegrationTest
fixtures :users, :preferences
def test_register_new_user
get "/login"
assert_response :success
assert_template "login/index"
get "/register"
assert_response :success
assert_template "register/index"
post "/register",
:user_name => "happyjoe",
:password => "neversad"
assert_response :redirect

You might also like