Disección de una aplicación Rails
(Sigue siendo) La plataforma de desarrollo web de los samurais
Esteban Manchado Velázquez
<zoso@grupocpd.com>
Grupo CPD
La aplicación
- PatchServer (servidor de parches (qué agudo))
- Gestionar parches para diversas aplicaciones
- Parches, versiones de parches, programas, usuarios...
- Vamos a jugar un poco, y luego modificamos
Primera fase
¿No dije «jugar»?
(era para ver si estaban atentos)
Primera fase
- Ver la aplicación por encima
- Ver los modelos (Patch, PatchVersion,
Program)
- Jugar con script/console
- Ver los controladores
Segunda fase
- Primera modificación: sistema de comentarios cutre
- Crear el modelo/tabla (generate y migrate)
- Crear las relaciones
- Probar con script/console
- Mostrar los actuales
- Formulario creación
- ¿Estrellitas de Super Mario?

Segunda fase (chuleta)
function update_stars(num)
{
for (var i = 0; i < 10; ++i) {
var star = $("star"+(i+1));
if (i < num) {
if (! star.visible()) {
Effect.Appear(star);
}
} else {
if (star.visible()) {
Effect.Fade(star);
}
}
}
}
Tercera fase
- Segunda modificación: sistema de configuración cutre
- Crear el modelo UserPref y sus relaciones
- Escribir User#prefs_hash
- Probar con script/console
- Crear PatchesController#preferences
- Grabar las preferencias y usar flash
Tercera fase (chuleta)
def prefs_hash
user_prefs.inject({}) {|h,up| h.merge({up.name =>
up.value})}
end
UserPref.find_or_create_by_user_id_and_name(id, k)
Cuarta fase
- Tercera modificación: avisos por correo electrónico
- Escribir User.users_with_pref
- Crear el «cartero» Notifier
- Escribir Notifier#new_patch
- Probar con script/console
- En PatchesController#add_item,
Notifier.deliver_new_patch
Cuarta fase (chuleta)
class Notifier < ActionMailer::Base
def new_patch(patch)
from NOTIFIER_FROM
recipients lista_usuarios
subject "New patch from #{patch.author.login}"
body :patch => patch
end
end
Enemigo final
- Ver las pruebas unitarias
- Ver las pruebas funcionales
- Ver la prueba de Selenium login.sel
- Con Selenium, comprobar el Javascript de la página
(sí, amiguitos)
Chuleta final
|assertTextPresent|login|
[...]
|waitForPageToLoad|30000|
[...]
|assertNotVisible|new_app_name|
[...]
|select|new_item_program_id|label=regexp:^Exp. reg.$|
[...]
|select|new_item_program_id|index=0|