Programación
en Ruby on Rails en
Microsoft Windows XP, Vista, 7 y 8
Esta es la segunda parte, sobre programación en
Ruby on Rails. La primera
parte la pueden encontrar en el siguiente enlace:
En esa parte se explicó:
·
Cómo instalar y configurar Ruby on Rails.
·
Cómo se divide un proyecto de Ruby on Rails de acuerdo al Modelo
Vista Controlador.
·
Cómo se hacen bucles en Ruby.
·
Cómo manejar la consola para crear
proyectos y hacer algunas consultas a la base de datos sqlite.
Entre otras cosas.
Quiero hacer hincapié en el hecho de que ese
tutorial lo he realizado de acuerdo a mis conocimientos. O sea, que si usted
sabe mucho más que yo, puede que le resulte muy obvio su contenido.
Si por el contrario, sabe mucho menos que yo,
entonces probablemente no haya comprendido casi nada.
Actualmente me encuentro aprendiendo un poco más
sobre las siguientes tecnologías:
·
API’s
·
Frameworks
·
HTML5
·
CSS3
·
Javascript y JQuery
·
Perl
·
C
·
Android
(Java)
·
Objective-C
Esas en negro, son a las que les estoy dando mayor
énfasis.
Lo normal sería, que primero aprendiera HTML,
luego CSS, luego PHP y Javascript, y ahí
seguidamente.
Pero es que las tecnologías cambian, hay que
ponerse al día. No puedo gastar todo el tiempo aprendiendo tanto de cada
cosa, sino que tengo que ver cuáles cosas resulta más productivas y a las que
se les puede sacar mayor provecho.
Y son precisamente esas cosas en las que estoy
enfocado ahora. Los lenguajes para diseño y programación Web, las
aplicaciones para dispositivos móviles o que las que son para escritorio que
interactúan con redes sociales.
Tengo 3 años de estar llevando una ingeniería en
computación, y no deja de sorprenderme la cantidad de cosas que uno debe
saber de antemano para poder producir software de calidad, o por lo menos una
reléase estable que se pueda vender.
Normalmente usted tendría que saber mucho de PHP, Javascript, CSS y HTML para poder entrar de lleno a
aprender desarrollo web con Frameworks tal como
Ruby on Rails, o API’s como las de Google o Facebook. Pero no hay tiempo.
Y eso que tengo bastante tiempo libre, si tuviera menos tiempo, sería
imposible.
Todos saben que aprender a improvisar y hacerlo
bien es lo más productivo y beneficioso, por eso me lancé de lleno con Ruby on Rails, y voy aprendiendo, en
el proceso, algunas cosas de CSS3, HTML5, y Javascript.
Bien, ahora a comenzar.
Las bases de datos uno las puede manejar con
lenguajes sql, pero también con Consultas ActiveRecord.
Ya hemos visto algunas en el tutorial anterior:
MiModelo.all
|
Muestra todos los registros de la tabla
modelo
|
Loquesea
= MiModelo.new
|
Crea una nueva instancia de la clase MiModelo
|
Loquesea.atributo
= valor
|
Asigna un valor al atributo de esa clase
|
Loquesea.save
|
Guarda la instancia en la tabla MiModelo
|
Como puede ver, una Tabla y una Clase están
relacionadas en Ruby on Rails.
Pero además, hay otros “comandos” o “métodos” que
se pueden usar
MiModelo.find(3)
|
Busca el registro con id=3
|
MiModelo.last
|
Retorna el último registro en la tabla MiModelo
|
MiModelo.where(:miNombreEnModelo=> “Geovanny Mendez Marin”)
|
Retorna el registro o los registros donde
el atributo sea igual a un valor específico
|
MiModelo.order(“miNombreEnModelo”)
|
Ordena los registros por un atributo en
específico por defecto es ascendente
|
MiModelo.order(“miNombreEnModelo ASC”)
MiModelo.order(“miNombreEnModelo DESC”)
|
Ordena de forma ascendente o descendente
según lo indicado, de acuerdo al atributo “miNombreEnModelo”
|
MiModelo.limit(5)
|
Muestra 5 registros empezando desde el
primero
|
MiModelo.limit(5).offset(3)
|
Muestra 5 registros empezando del tercero
|
Además, se pueden combinar. Por ejemplo este
último es una combinación de limit y offset. Si
utiliza solo offset, retorna todos los registros a partir del tercero.
Otro ejemplo de combinación es el siguiente:
MiModelo.order(“miNombreEnModelo DESC”).limit(5).offset(3)
Estos métodos son una forma más rápida de realizar
consultas php. El Modelo Vista Controlador facilita
la tarea de organizar y generar páginas de forma dinámica.
Hay otra técnica que sirve para acelerar el
proceso de creación de contenido, a continuación nos referiremos a los
siguientes temas:
·
Modelo REST
·
Scaffolding
Básicamente el Scaffolding
hace lo siguiente:
·
Crea un modelo, con un controlador y una
vista
·
Crea un formulario que usa el modelo REST
Es un asunto de formularios. Los formularios
funcionan con HTTP, que tiene dos acciones principales:
·
GET: Obtener información
·
POST: Escribir información
Pero ¿qué pasa si queremos ELIMINAR o ACTUALIZAR
información? Para ello se usa el modelo REST, que tiene dos acciones
adicionales
·
DELETE: Elimina datos
·
PUT: Actualiza datos
Estas dos acciones REST las construye usando
lenguaje Javascript.
Vamos a crear en el mismo proyecto, una
funcionalidad con Scaffolding.
Tiene que realizar las siguientes acciones:
Acción
|
Observación
|
Ejecute
rails
g scaffold Articulo titulo:string
texto:text
en D:\Programming\RoR\proyecto001
|
Crea un nuevo modelo, un controlador, y
una vista, usando el Scaffolding
|
Acción
|
Observación
|
Ejecute
rake
db:migrate
en D:\Programming\RoR\proyecto001
|
Migra la base de datos para el nuevo
modelo creado
|
Crea un modelo Articulo, es una tabla de la db y una clase
Crea un controlador Articulo con una serie de métodos
Crea dos atributos, título y texto, de tipo string y text
Una vez creado, usted puede entrar en la dirección
Hay un formulario donde puedes hacer uso del
programa generado.
Si usted da click en new
Articulo, lo envía a un formulario donde puedes escribir información. Esa
acción está asociada a una dirección web
Ahora si usted da cick
en Create Artículo, lo envía a la siguiente ruta,
note que al final aparece /1, que es la id del artículo creado (en la base de
datos). Usa el método POST para crear el contenido.
Si usted da click en edit, a ese /1 le agrega un edit,
quedando …/1/edit
Este lo usa para editar el contenido, con el
método PUT del modelo REST:
Al darle Update Article, lo devuelve a la página de /artículos, pero esta
vez no dice que el artículo fue creado, sino más bien dice que fue
actualizado:
Además, conforme se van agregando artículos, nos
retorna a la página /artículos, donde hay una lista. Aquí se hace uso del
método GET
Se van enlistando, y aparece una opción Destroy, que hace uso del método DELETE:
Si usted da click en Destroy, Aparece una ventana modal para confirmar la
supresión de ese artículo:
Al eliminar el artículo vuelve a la misma página
de /artículos, con la lista de todos los artículos excepto el que se ha
eliminado.
Vamos a crear un nuevo proyecto, borrando lo que
ya tenemos (si seguiste la primera parte del tutorial, tendrás creado unos
archivos.
Primero cerramos la consola cmd
si es que se está ejecutando.
Luego, eliminemos la carpeta
D:\Programming\RoR\tutorial001
Ahora estamos en la carpeta D:\Programming\RoR\
Ejecutemos los siguientes comandos en el cmd:
rails
new tutorial001
cd tutorial001
gem
install node
rails
g scaffold Articulo titulo:string
texto:text
rake
db:migrate
rails
s
Todos son comandos que ya se han visto en estos
tutoriales. Si tiene alguna duda puede consultar el material anteriormente
visto para saber la función de esos comandos. También puede consultar en google o preguntar en foros de programación.
Todo el proceso puede tardar de 3 a 5 minutos en
acabar de ejecutarse.
Esto te creará todo el proyecto y te habilitará el
servidor. No cierres el cmd porque el servidor está
corriendo.
Entra en localhost:3000/articulos
Ahora vas a ver que puedes comenzar a crear
artículos.
Vamos a mostrar todos los archivos relevantes para
la explicación sobre REST.
·
app
o
assets
§ images
§ javascripts
·
application.js
·
articulos.js.coffee
§ stylesheets
·
application.css
·
articulos.css.scss
·
scaffolds.css.scss
o controllers
§ application_controller.rb
§ articulos_controller.rb
o helpers
§ application_helper.rb
§ articulos_helper.rb
o views
§ layouts
·
application.html.erb
§ articulos
·
_form.html.erb
·
edit.html.erb
·
index.html.erb
·
new.html.erb
·
show.html.erb
o models
§ articulo.rb
·
config
o routes.rb
·
db
o migrate
§ 20130123143053_create_articulos.rb
|
En cuanto a las vistas, se han creado 4 vistas
adicionales:
·
_form
·
edit
·
new
·
show
De todos ellos, el _form
es el único Parcial. Los parciales pueden ser utilizados en otras vistas.
Antes de explicar el código de las vistas, primero
atendamos el código contenido en el controlador.
El controlador está especificado en el archivo artículos_controller.rb
Primero se especifica el nombre del controlador,
cuya clase es ArticulosController, que hereda de ApplicationController, que, como ya hemos dicho, es de
donde todos los controles heredarán características, y es otro archivo que
aparece en la misma carpeta donde está artículos_controller.rb.
Las líneas de la 2 a la 11 indican el primer
método de este controlador. Es como una especie de constructor.
Lo que hace es, asignarle a una variable @articulos, todos los registros de la tabla Articulo, a
través de una consulta ActiveRecord.
Recordemos que la tabla Artículo tiene registros que
tienen dos atributos, un título y un texto.
respond_to
es arreglo especial de Ruby on Rails,
y la palabra format es inventada, para iterar sobre
dicho arreglo.
Como puede ver el arreglo tiene dos tipos de
elementos, que son html y objetos json.
Estos objetos json
servirán para que nuestra aplicación pueda ser usada por terceros. No podemos
profundizar en ello, investigue a fondo los objetos json,
en mi universidad los mencionan todas las semanas pues son importantes para
la programación web.
Los comentarios indican que esta consulta será utilizada
en la ruta /artículos.
Este es parecido al método anterior, pero la
consulta ActiveRecord es diferente, porque no busca
todos los registros de la tabla Artículo, sino que solo encuentra un artículo
con una id específica.
Los comentarios de las líneas 13 y 14 muestran la
dirección en la que se utiliza este método.
Otro método idéntico al anterior, pero la consulta
ActiveRecord crea un nuevo elemento. Ponga atención
en lo siguiente: El elemento se crea, como cuando se crea la nueva instancia
de un objeto, pero recordemos que para que esta instancia se guarde en el
modelo, se necesitaría declarar @articulo.save, una
consulta que guarda el contenido de la instancia. Cuando se entra a new, a
través del link que muestran los comentarios en las líneas 24 y 25, se crea una nueva instancia, pero no se guarda.
Este método solo recupera el archivo a través de
su id, pero no lo edita, solo lo recupera de la base de datos, de la tabla
Artículo.
En este método, se crea un nuevo artículo, pero
recibiendo parámetros, desde el submit del
formulario que estará en una de las vistas.
Con el if, se intenta
guardar el archivo. @articulo.save retorna true si
el archivo se guardó exitosamente. En ese caso hace lo siguiente
Notice
= “El artículo fue creado satisfactoriamente”
Statis:
:created
Redirecciona
al @articulo, un objeto que tiene parámetros, es decir a la página donde
estaba.
Por otra parte, si el artículo no se puede guardar
por alguna razón, se retorna al formulario de new, y al objeto json se le especifica que la petición no ha podido ser
procesada.
La dirección especificada en los comentarios lo
que indica es que una vez terminada la acción de creación, debe volver a /artículos.
Es similar a la explicación anterior, pero cambia
el mensaje de created a updated.
Una vez actualizado el ítem, debe volver a la dirección /artículos/id.
En las líneas 75 y 76, se busca el artículo por su
id, y se elimina con la consulta ActiveRecord destroy.
Ahora, veamos las vistas. Voy a suprimir el código
html para centrarme solo en el código de las
consultas:
index.html.erb
Este archivo llama al método index
del controlador. La variable @articulos recoge
todos los artículos con una consulta ActiveRecords
(Articulos.all).
¿Por qué no se llama aquí en la vista? Recordemos
que estamos en la arquitectura de Modelo-Vista-Controlador, por lo que, las
vistas solo pueden acceder a la información del modelo a través del
controlador. Esto se hace con propósitos de escalamiento, de reutilización
Tal vez usted piense que esto no tiene mucho
sentido, pero cuando se hacen grandes aplicaciones y se necesitan reutilizar
módulos y código, encontrará de gran utilidad el Modelo-Vista-Controlador,
así que por ahora solo le puedo recomendar aprenderlo.
Bien, en esta línea, se recorre la tabla Articulos y se extraen todos los artículos. Se imprime el
título y el texto de cada artículo, y se envía el artículo como parámetro con
link_to.
Para poder comprender bien el código, debe
estudiar link_to. Es una palabra reservada. También
lo es edit_articulo_path. Es obvio que este código
es una abstracción de llamadas a métodos de Javascript,
pero en Ruby on Rails no
necesitas escribir el código en Javascript,
simplemente lo escribe en Ruby y que el compilador realice todas las
modificaciones pertinentes.
También está new_articulo_path.
Cuando veamos el resto de vistas, estos códigos tomarán más sentido.
new.html.erb
Cuando se llama a new articulo,
se llega a este archivo. Observe que casi no tiene código, pero muestra el
formulario, el botón de crear artículo y un botón de ir atrás.
Todo el formulario sale de la línea 3. El
formulario es una vista Parcial. Puede ser utilizado en todas las demás
vistas simplemente llamándole a través del método render.
Esto se puede hacer por la forma en que está programado, que ya la veremos
más adelante, y además por su nombre _form.html.erb,
nombre que indica que es una vista Parcial.
edit.html.erb
Es exactamente el mismo caso de new, solo cambian
los enlaces de ir atrás, o mostrar el artículo (cada artículo tiene una vista
individual)
show.html.erb
Esta es la vista individual de cada artículo. Es
igual a new y edit, pero mostrando algunos cuantos
datos del registro (el artículo, con respecto a su id).
_form.html.erb
El formulario es básicamente de las líneas 14-25,
lo que pasa es que la intercepción de los errores es muy importante en Ruby on Rails, por lo que se
capturan los mismos en las líneas 1-12.
Note que en las líneas 15 y 16 así como en las
líneas 19 y 20, tanto el text_field, el text_area y el label, se llaman
igual que los campos de Articulo.
Esto resulta importante porque resulta que luego
esos nombres son los que REST usa con Javascript
para realizar el proceso de consulta.
Como recordaremos este tutorial no tiene ninguno
anterior sobre Javascript, así que no puedo
explicar su funcionamiento. Solo cuando hagamos algo en Javascript
comprenderemos bien los EVENTOS.
Pero podemos ver el código generado:
Enlaza a varios archivos de javascript
como artículos.js y application.js. Resulta que esos archivos están vacíos,
no contienen nada. Entonces ¿De dónde saca REST las acciones de PUT, y DELETE?
Es porque, silenciosamente, agrega dos scripts de jquery
Por la misma naturaleza de reutilización de
código, Ruby on Rails no
crea nuevos códigos Javascript, sino que asume automáticamente
que un desarrollador debe usar en su sitio web las funcionalidades de la
librería jquery y agrega esta librería de dónde
saca los métodos para REST.
Otro asunto a tomar en cuenta es que esto no lo
puede hacer con el código CSS3, porque realmente no sabe cuál es el estilo
que le quiere dar el desarrollador, entonces, en el archivo scaffolds.css
escribe unos cuántos estilos.
La línea 2 indica el color de fondo de la página.
La línea 3 indica el color de la fuente, que a
veces en programación se conoce como foreground, o
también como font-color.
Ambas están escritas en código hexadecimal.
La línea 4 indica el tipo de letra y la familia.
Como no sabemos CSS3 con total exactitud no podemos saber exactamente cómo
serán usadas esas letras y en qué se diferencia el orden en el que las
pongamos. Por ejemplo si arial fuera la primera y verdana la segunda. Esto requiere un estudio de CSS.
La línea 5 indica el tamaño de la fuente en
pixeles.
La línea 6 indica el espacio que ocupa cada salto
de línea. En este caso se especifica con un número, pero también se puede
especificar con porcentajes u otros datos.
La palabra body indica que
esto afectará a los elementos que vayan entre <body></body>. El body se encuentra
en el layout application.html.erb.
La línea 9 indica que los elementos que vayan
entre <p></p>, <ol></ol>, <ul></ul> y <td></td>
El significado de cada una se:
p: Párrafo
ol:
Lista ordenada numéricamente
ul:
Lista no ordenada
td:
La fila de una tabla
Las líneas 10, 11, 12 modifican información que ya
hemos explicado.
Pre viene de preformato,
lo he visto siendo utilizado en blogs para formatear el texto de manera que
tenga ciertas condiciones especificadas.
El padding es un tipo de
margen, hay varias formas de especificarlo, y para una mejor explicación
deberías leer sobre margin y padding,
haciendo una búsqueda en google.
Este caso es un poco más “complejo” pero no
presenta ninguna dificultad comprenderlo.
La etiqueta a hace referencia a los enlaces web,
por ejemplo
<a src=”http://gmendezm.blogspot.com/”>enlace</a>
Lo cual se muestra renderizado
como
Este enlace tiene varios eventos. Cuando usted
pasa el puntero por encima del enlace renderizado,
eso se conoce como hover. Cuando el enlace ha sido
visitado, ese evento es visited. Entonces como
usted puede ver, después de visitar el enlace este se muestra de un
determinado color.
En la línea 22 se indica que el enlace
originalmente debe ir en color #000, que es el color negro.
La línea 21 indica que el evento que se está
estilizando es visited. En cuanto a la línea 22 ya
se sabe que realmente es el color del texto.
Las líneas 26-28 indican que cuando se de el evento hover (pasar el
puntero por encima del enlace) el fondo será de color negro y la fuente de
color blanco. Usted puede verificarlo en localhost:3000/articulos
pasando el puntero sobre el enlace de New Articulo, que se mostrará así:
El div es un bloque, es decir que todas los
elementos que están entre las etiquetas <div></div> conforman un
bloque.
La línea 33 muestra eventos del div, que en css se pueden separar por comas.
La línea 34 especifica el margen, con la palabra margin, y la palabra bottom
hace referencia al margen (si es izquierdo, derecho, inferior o superior)
inferior del div. Este margen debe tener un tamaño de 10 pixeles.
La línea 38 tiene la alabra
notice con un sharp, el símbolo
#, antepuesto. Esto lo que indica es que se está identificando a un elemento
con un id = notice.
Estos identificadores los usa tanto Javascript como CSS, para acceder a los elementos HTML5.
Este en particular hace referencia a la vista show.html.erb
Que lo que indica es que los mensajes con esa id
se muestren en color verde, como se muestra en la captura de ejemplo:
En este caso no se ha usado un código hexadecimal
para especificar el color, sino que se ha usado una palabra reservada, green, que indica el color específico que tendrá ese
elemento.
En la línea 42 no se antepone un # sino que se
utiliza un punto, eso hace referencia a la clase de un elemento, y se
especifica con la palabra class.
Por ejemplo, para un div, un identificador se
representa con
<div id=”identificador”></div>
Mientras que para ese mismo div, una clase se
representa con
<div class=”clase”></div>
En ambos ejemplos la palabra clase y la palabra
identificador pueden ser sustituidas por la palabra que guste.
Algunas clases se muestran, por ejemplo, en _form.html.erb
Pero la clase field_with_error
no aparce en ninguna de las vistas. Probablemente
está reservada para un campo que contenga un error, pero eso no está
implementado en el scaffolding.
En
La línea 45 muestra el tipo de forma en que se
mostrarán los errores, en forma tabular.
|
En este caso, el identificador error_explanation tiene en la línea 49 especificado el
ancho en 450 pixeles. En la línea 50 el borde mide 2 pixeles, es de color
rojo, y su continuidad está especificada con la palabra solid
(para más información, busque sobre css border en Google). Las líneas 51-54 usted puede
obviarlas de acuerdo a todo lo anteriormente explicado.
h2 se encuentra dentro de #error_explanation. Esto quiere decir, que el componente
será un h2, pero solo será tomado en cuenta el estilo si dicho h2 está
dentro de un contenedor cuyo identificador es error_explanation.
h2 es un un
tipo de heading, un título.
En la línea 56 se especifica el
alineamiento del heading, a través de la palabra left (izquierda).
|
Por otra parte en la línea 57 se especifica que la
letra será negrita.
El resto del contenido CSS3 se obvia, con
excepción de la línea 67, que indica que el estilo de la lista será square (cuadrada).
No hay comentarios:
Publicar un comentario