Curso Ruby con Ruby on Rails
De McWiki
Inicio
También siempre en construcción, sienteté libre de aportar conocimientoes o correcciones.
Algo de Historia
¿De dónde viene Ruby?
Un programador japonés que se llama [Yukihiro Matsumoto] piensa así: "They are focusing on machines. But in fact we need to focus on humans, on how humans care about doing programming or operating the application of the machines. We are the masters. They are the slaves."
Viene a decir que lás máquinas son nuestras esclavas y no los humanos exclavos de las máquinas. En cierta medida lleva razón pero mucho [Matrix http://www.matrix.com] me parece a mi que ve este hombre ;-)
Imagen:"http://wiki.mctux.com/images/matz-beard.jpg"Imagen:"http://wiki.mctux.com/images/RubyHeart.jpg"
¿De dónde viene Ruby on Rails (de ahora en adelante RoR)?
Un programador danés que se llama David Heinemeier Hansson fue el creador de RoR, que utilizando el lenguaje Ruby creó una aplicación llamada Basecamp. Y de aquí nació RoR de la reutilización de este conocimiento.
¿Y Ajax?
Según McTux:// AJAX es una técnica que está ayudando a la Web 2.0 Consiste en unir el lenguaje Javascript y el metalenguaje XML para trabajar juntos de forma asíncrona, es decir, cada uno por su lado y a su ritmo.
Segun Wikipedia:
AJAX, acrónimo de Asynchronous JavaScript And XML (JavaScript y XML asíncronos), es una técnica de desarrollo web para crear aplicaciones interactivas. Éstas se ejecutan en el cliente, es decir, en el navegador del usuario, y mantiene comunicación asíncrona con el servidor en segundo plano. De esta forma es posible realizar cambios sobre la misma página sin necesidad de recargarla. Esto significa aumentar la velocidad de interacción en la misma.
Una amplia documentación en AJAX en la wikipedia
¿Qué es la Web 2.0?
Características principales de Ruby
Lenguaje de guiones interpretado
*Imagen:Images/Ruby.png Posibilidad de realizar directamente llamadas al sistema operativo. *Imagen:Images/Ruby.png Potentes operaciones sobre cadenas de caracteres y expresiones regulares. *Imagen:Images/Ruby.png Retroalimentación inmediata durante el proceso de desarrollo.
Rápido y sencillo
*Imagen:Ruby.png Son innecesarias las declaraciones de variables. *Imagen:Ruby.png Las variables son de tipo dinámico. *Imagen:Ruby.png La sintaxis es simple y consistente. *Imagen:Ruby.png La gestión de la memoria es automática.
Programación orientada a objetos:
Imagen:Ruby.png Todo es un objeto. Imagen:Ruby.png Clases, herencia, métodos, ... Imagen:Ruby.png Métodos singleton. Imagen:Ruby.png Mixins por módulos. Imagen:Ruby.png Iteradores y cierres.
Y También:
Imagen:Ruby.png Enteros de precisión múltiple. Imagen:Ruby.png Modelo de procesamiento de excepciones. Imagen:Ruby.png Carga dinámica. Imagen:Ruby.png Hilos.
Características principales de Ruby on Rails
* Entorno de desarrollo web * Escrito en ruby * Máxima productividad * Fácil de aprender
Características principales de Ajax
x
MVC Modelo, Vista y Controlador
Convención sobre configuración
¿Hay alguna duda sobre cuando usar nombres en plural y cuando en singular? Es fácil los nombres de tablas de la BBDD en plural y el resto en singular.
Aún así en rails vamos a aclarar que convenciones se usan, la nomenclatura:
Model - Singular.rb , como ya sabeis todos en la carpeta app/models
Vista - Singular.rhtml (si se usa erb) , para navegar por la vista simplemente entrar controlador/vista, cada una en su carpeta app/views/nombre_de_controlador
Controlador - Singular_controller.rb
Tablas - Siempre en plural.
Instalaciones
x
Instalando Ruby
Tan fácil como:
Abre este enlance para encontrar la ultima version de RUBY http://rubyforge.org/frs/?group_id=426
El documento es del tipo ruby-x.y.z.tar.gz
En el momento de escribir esto la ultima version es ruby-1.8.5.tar.gz
| Código: Descargando ruby mediante wget |
# wget http://rubyforge.org/frs/download.php/7858/ruby-1.8.5.tar.gz |
Y después:
| Código: Descomprimir y desempaquetar con: |
# tar -zxvf ruby-1.8.5.tar.gz |
Abre este enlance para encontrar la ultima version de RUBY
http://rubyforge.org/frs/?group_id=426
Instalando RoR
Otra posibilidad es mediante RubyGems y sería:
Instalando RubyGems
| Código: Descarga e instala |
# wget http://rubyforge.org/frs/download.php/5207/rubygems-0.8.11.tgz tar -zxvf rubygems-0.8.11.tgz ruby setup.rb |
Ahora RoR
| Código: uso de gem para instalar |
# gem install rails –include-dependencies |
Instala rails y sus dependencias.
Configuraciones
Intercambiando Entornos
Rails puede ser usado en diferentes entornos. Cada entorno es diferente y esto os ayudara a desarrollar aplicaciones más eficientes de la forma más cómoda, con esto rails ayuda en el ciclo de desarrollo.
Hay tres entornos:
1. Desarrollo (Development). Cambia y observa cambios. En este entorno si aparecen errores descriptivos de Rails.
2. Test (Para pruebas)
3. Producción (Production). Aquí se espera que el código no cambie, con lo cual modelos y controladores son cacheados para correr rápido. Esto significa ahorrar viajes a la base de datos, resultando una aplicación rápida de carga. En producción los mensajes de error son muy concisos y no son técnicos, es decir, son mensajes para el usuario final de la aplicación.
¿Cómo cambiar de entorno?
Abrir archivo config/environment.rb y reemplazar:
RAILS_ENV = ENV['RAILS_ENV'] || 'production'
with
RAILS_ENV = 'development'
Las gemas de ruby
Configurando el entorno para las gemas
Tú debes instalar las gemas que no estén preisntaladas en tu servidor McTux:// en tu directorio Inicio.
Asumiendo que estás en tu bash, haz lo siguiente:
| Código: Instalando gemas |
# mkdir ~/.gems # cat >> ~/.bash_profile # export GEM_HOME=$HOME/.gems # export GEM_PATH=/usr/lib/ruby/gems/1.8:$GEM_HOME |
Luego presiona CTRL+D para salir del "cat" y volver al símbolo de sistema.
Una alternativa muy interesante para configurar entorno GEM_PATH para usar en conjunto con Capistrano sería:
Crear un fichero para cada usuario ~/.gemrc con:
| Código: Instalando gemas |
# mkdir ~/.gemsgemhome: /home/<usuario>/.gems gempath: /home/<usuario>/.gems /usr/lib/ruby/gems/1.8</nowiki> |
El comando gem
gem es la herramienta principal de RubyGems.
Lo más común de utilizar gem:
| Código: Listar las gemas instaladas |
# gem list |
| Código: Desinstalar una gema |
# gem unisntall actionmailer |
| Código: Instalar una gema |
# gem install actionmailer |
| Código: Actualizar una gema |
# gem update actionmailer |
Para ver el resto de comandos de gem que existen:
| Código: Todos los comandos de gem |
# gem help commands |
| Código: -r para gemas remotas |
# gem search -r generator |
Para buscar gemas de forma remota (repositorio RoR en inet), si omitimos -r busca gemas en local.
Utilizando las gemas en tus aplicaciones Rails
Lo primero desempaquetar las gemas en RAILS_ROOT/vendor.
| Código: Desempaquetando una gema |
# gem unpack nombre_gema |
Ahora bien si la gema no se añade a tu PATH, tienes que hacerlo tu mismo:
| Código: Desempaquetando una gema |
# config.load_paths += %W( #{RAILS_ROOT}/vendor/nombre_gema/lib )
|
Ahora en tu archivo config/environment.rb, reemplazar nombre_gema con la gema que tu estás cargando (recuerda incluir también la versión)
Un tip de McTux://
| Archivo: Para todas las gemas... en config/environment.rb |
|
ENV['GEM_PATH'] = File.expand_path('~/.gems') + ':/usr/lib/ruby/gems/1.8' |
Esto permite a múltiple aplicaciones Rails compartir el mismo directorio de gemas. ;-)
Mi primera aplicación con RoR
Creando un Esqueleto
Es muy fácil. rails <nombre de nuestra aplicación> rails holamundo ( ¿Cómo no? ;)) )
Anatomía de una aplicación Rails
Anatomía de una Aplicación Rails
Una aplicación rails se encuentra en el subdirectorio app y se compone de los siguientes directorios:
* apis - las librerías que su programa requiere fuera de Rails mismo. * controllers - Los controladores * helpers - Los helpers * models - Los modelos. Basicamente las clases que representan los datos que nuestra aplicación manipulará. * views - Las vistas, que son archivos rhtml (como JSP o ASP). * views/layouts - Los diseños. Cada controlador tiene su propio diseño, donde se pondran las cabeceras y pies de página. * config - Archivos de configuración. La configuración de la base de datos se encuentra aquí. * script - Utilerías para generar código y ejecutar el servidor. * public - La raíz del directorio virtual. Cualquier contenido que usted encuentre aquí será publicado en su aplicación directamente. En una nueva aplicación, usted puede encontrar las páginas web para los errores 404 y 500, las imágenes, javascripts, estilos, etcétera. * test - Los archivos para las pruebas funcionales y de unidad.
Ese servidor web que llevas dentro, WEBrick
Nuestro esqueleto tambien cuenta con un pequeño servidor web, lo arrancamos: cd test ruby script/server
El servidor web LOCAL, arranca en el puerto 3000. Este es el puerto que vamos a accesar utilizando nuestro navegador favorito (FIREFOX ;-). La direccion es localhost, o 127.0.0.1. Así que en nuestro navegador iremos a http://127.0.0.1:3000/ . Si todo salió bien, veremos una pantalla de felicitaciones con instrucciones para configurar Apache y pasos siguientes.
Generando código
Ahora vamos a crear nuestro módulo principal de la aplicación, la pantalla de inicio del directorio de la aplicación.
ruby script/generate controller principal
y nos devuelve:
exists app/controllers/ exists app/helpers/ create app/views/principal exists test/functional/ create app/controllers/principal_controller.rb create test/functional/principal_controller_test.rb create app/helpers/principal_helper.rb
Ahora puedes visitar http://rails.mctux.com/holamundo/public/ para ver
Unknown action No action responded to index
El archivo creado se llama app/controllers/principal_controller.rb. Vamos a poner nuestro código ahí:
vi app/controllers/principal_controller.rb
class PrincipalController < ApplicationController
def index
mensaje = "Hola Mundo!!!
"
["Javier", "Roberto", "Raúl"].each do |nombre|
mensaje += "y a "+nombre+" tambien
"
end
render_text mensaje
end
end
Finalmente, queremos que la raíz de esta aplicación sea también nuestro controlador. Así que eliminamos el index.html de bienvenida:
$ rm -rf public/index.html
Ahora si vamos a la página de nuevo, ahora dirá: Routing Error Recognition failed for "/"
Es porque todavía no le hemos dicho a la aplicación que nuestro controlador "por defecto" es el principal y hemos borrado el index.html. Lo vamos hacer definiendo una "ruta". Así que modificamos la configuración de rutas, en el archivo config/routes.rb:
map.connect '/', :controller => 'principal'
Ahora F5 en nuestro firefox y voilá! ya está!
Aunque no es necesario para este ejemplo porque no tenemos BBDD vamos a generar un modelo:
ruby script/generate model contact devuelve:
exists app/models/
exists test/unit/
exists test/fixtures/
create app/models/contact.rb
create test/unit/contact_test.rb
create test/fixtures/contacts.yml
Configurando la base de datos
Rails utiliza configuraciones por separado para desarrollo (development), prueba (test) y producción. Lo normal es que creemos para nuestro ejemplo holamundo_dev para desarrollo, holamundo_test para test y holamundo_prod para producción.
La recomendación es usar los sufijos "_dev" para desarrollo, "_test" para prueba y "_prod" para producción, y que su nombre básico de la base de datos sea el mismo.
Para crear las 3 BBDD ejecutamos:
Y para enlazar la aplicación con las BBDD hay que modificar el archivo config/database.yml Aquí se configuran los accesos paras las 3 BBDD, desarrollo, test y producción.
Para cambiar entre entornos se modifica el archivo config/environment.rb mediante estos cambios:
Entendiendo Migrations con rake
Por Migration en ruby se entiende cada cambio de diseño (estructura) a nuestro entorno back-end de BBDD.
Para generar un nuevo cambio o "foto" hacemos script/generate migration nombre_del_cambio, por ejemplo si hemos añadido dos campos nuevos sería:
script/generate migration add_age_and_city_fields
Esto nos genera un archivo en db/migrate/00x_add_age_and_city_fields.rb (por ejemplo 002_add_age_and_city_fields.rb)
Falta por explicar y documentar aquí self.up y self.down
para aplicar/ejecutar una migración:
rake migrate VERSION=2
o
ENV_RAILS='production' rake migrate VERSION=2 (que aplicaría la migración sólo en bd producción)
Comandos muy útiles de rake:
rake db_schema_dump para hacer un dump con la estructura de la bbdd, crea db/schema.rb vacío o con el esqueleto.
rake db_schema_import importa el schema y crea la base de datos, si tenemos sqlite3 genera un archivo db/development.rb
ahora para insertar datos podemos hacer:
sqlite3: sqlite3 db/development.db < db/dump.sql o en mysql: mysql -p --database nombrebbdd < db/dump.sql
un contenido de ejemplo para dump.sql BEGIN TRANSACTION; INSERT INTO "items" VALUES(1, 'caja', 3, 10); INSERT INTO "items" VALUES(2, 'carretilla', 2, 60); INSERT INTO "items" VALUES(3, 'tenazas', 15, 3); INSERT INTO "items" VALUES(4, 'batman', 1, 3000); INSERT INTO "items" VALUES(5, 'morcilla de pescado', 2, 8); INSERT INTO "items" VALUES(6, 'sauerkraut', 9, 9); INSERT INTO "items" VALUES(7, 'regadera', 4, 13); INSERT INTO "items" VALUES(8, 'dandiliones', 78, 1); INSERT INTO "items" VALUES(9, 'nevera', 12, 250); INSERT INTO "items" VALUES(10, 'cerillas voladoras', 8, 145); INSERT INTO "items" VALUES(11, 'acordeón roto', 1, 18); INSERT INTO "items" VALUES(12, 'silbido salvaje', 5, 7); INSERT INTO "items" VALUES(13, 'caracol histérico', 8, 13); COMMIT;
o si es mysql sería : @INSERT INTO items VALUES (1, ‘hoe’, 3, 10);@
Pruebas de Unidad
Similar a JUnits en Java, Rails soporta pruebas unidad, es decir, probar por separado todo.
Preveer errores
Más vale prevenir que curar, es por ello, que preparamos un batería de pruebas con datos reales, para que estos datos de prueba los consuma nuestros programas.
rubycoverage
Cobertura. De las pruebas de Unidad. ¿Cómo sabemos cuántas y qué líneas de código se están probando? y ¿Cuáles no?
Uso de rubycoverage:
Más cosas interesantes
Control de versiones con Subversion
x
Ha llegado Capistrano
Anteriormente conocido como SwitchTower y renombrado a Capistrano por problemas de patente, aquí tenemos a un ejemplar para hacer más fáciles y menos tediosos tus desarrollos de aplicaciones Rails.
Capistrano es una utilidad que nos sirve para ejecutar comandos en paralelo sobre múltiples servidores. Permite definir tareas con comandos y definir a la vez roles a cada servidor, para luego especificar ciertas tareas exclusivamente sobre ciertos roles.
Capistrano es capaz de hacer cualquier cosa que tu puedas hacer mediante shell script en un servidor. Justamente ejecutar pedazos de shell script en servidores remotos y con la posibilidad de interactuar con ellos dependiendo de sus salidas. También puedes por ejemplo subir ficheros y Capistrano incluye algunas plantillas básicas para permitirte dinámicamente crear y desplegar cosas como mantenimiento de pantallas, ficheros de configuración, shell scripts, y más.
Wee
Nitro
Cosas de casa
No todo iba a ser tan bonito, Rails tiene algunas tareas "extras" que hacer.
Limpiando sesiones
Si tu estás usando sesiones en tu aplicación, periódicmante tienes que purgar ficheros con sesiones antiguas del directorio tmp. Si tú no realizas esta tarea eventualmente tu aplicación vendrá a ser inestable.
Simplemente creamos una tarea cron:
| Código: crontab -e |
# crontab -e |
| Archivo: crontab -e |
|
[server]$ find /tmp/ -name 'sess_*' -ctime +1 -exec rm -f \{\} \; |
Esto elimina ficheros de sesiones de ruby del directorio tmp. La bandera -f es para forzar a eliminar sin pedir confirmación.
Tambien se puede restringir el comando find para tus propios ficheros con la bandera -user, y keep find from trying to go where it's not allowed to go with -maxdepth:
| Archivo: crontab -e |
|
[server]$ find /tmp/ -maxdepth 1 -name 'sess_*' -user 'tu_nombre_usuario' -ctime +1 -exec rm -f \{\} \; |
'tu_nombre_usuario' es el usuario con el que corre tu aplicación rails.
Cosas interesantes, falta por especificar apartado del temario
Embedded Ruby, erb
Decidiendo el aspecto.
ActiveRecord
ActivePack
Controla las acciones
Scaffold
Subete al andamio
AjaxScaffold
Algo con mucha magia también.
Rakefile
Una especie de makefile... pero escrito en ruby! Objetivos: stats,doc,test,test_recent,migrate
Enlaces
Aquí comparto con vosotros los mejores enlaces encontrados hasta ahora, irán creciendo ;-)
Ruby
mi tag en del.icio.us sobre ruby para tod@s
Ruby on Rails
Ajax
Ruby + RoR + Ajax = La revolución del desarrollo web
Hagamos un Servicio Web 2.0!!!
Hay varias posibilidades para hacer entre todos:
- Un portal para emprendedores, una comunidad emprendedora, con un fácil registro y sistema de Tags avanzado, con las actividades de cada empresa emprendedora. También de comunicación entre emprendedores con mismas actividades. Orientado a las sinergias virtuales entre emprendedores para posteriormente una sinergia presencial.
- Un portal WHO IS Web 2.0. Para satisfacer la necesidad a los desarrolladores web y empresas de consultoría Internet para saber cuando un dominio ha sido liberado una vez dado de baja en cualquier Registrador de dominios. Un dominio al darse de baja en un servidor tarda 30/35 días en ser desbloqueado.
- O una aplicación/servicio Web 2.0 que os inventeis y que sea vea claro 2 puntos:
- Sea abordable, esto os ayuda a evaluarlo el profesor.
- No exista aún!!!
Para saber si existe nuestra idea en Web 2.0 os recomiendo visitar:
WWWhat's New?
Aquí estan todas reunidas!


