Egresado de computación e informática

Páginas: 9 (2140 palabras) Publicado: 2 de mayo de 2013
Rails Cells. Renderizado por componentes “as it should be”
Sigo vivo.
Voy a tocar un proyecto que es nuevo para mí, pero me ha encantado. He tenido la oportunidad de charlar con el creador porque había encontrado un bug, y lo resolvimos (lo resolvió él, yo solo lo localicé) en cuestión de dos horas. Excelentemente mantenido.
El proyecto no es otro que Rails Cells (Github), que intenta traerde entre los muertos la renderización por componentes (aquel método #render_component) que ha sido abandonada por ser poco elegante y poco eficiente.
Las células (cells) pretenden ser entidades de las vistas más o menos independientes y fácilmente reusables a través de toda una aplicación. Son además una herramienta que logra simplificar el código de las vistas, hacer inecesarios muchos métodoshelpers, o al menos simplificarlos muchos.
Llegados a este punto uno pensará: “Eso ya existe, se llaman parciales“, pero no.
Sirven para lo mismo (encapsular y reusar), pero funcionan de forma diferente. Hay quien las define como parciales con esteroides, pero en realidad con controladores con acciones.
Nacen basándose en la convención de que las vistas han de ser vistas y sólo vistas, y toda lalógica debe estar encapsulada en niveles inferiores. No hay que ser un histérico con esto, y Dios no mata un gatito cada ves que alguien escribe un if-else en una vista, pero todos hemos visto (y escrito) vistas parecido a esta:
1
2
3
4
5
6
7
8
9
.toolbox
    - if user.webmarster?
        = render "webmaster_tools"
    - elsif user.admin?
        = render "admin_tools"
    - elsifuser.registered?
        = render "registered_user_tools"
    - else
        = link_to "Regístrate", sign_up_path   
Dios no mata a un gatito, pero feo es un rato. Lo habitual es escribir un helper parecido a este:
1
2
3
4
5
6
7
8
# application_helper.rb
def render_users_tools(us)
    partial = us.webmaster?  ? "webmaster" : (us.admin?  ? "admin" :  (us.registered_user? ? "registered_user" : nil))
    partial ? render("#{partial}_tools") : link_to("Regístrate", sign_up_path) 
end
 
#la vista
.toolbox= render_users_tools(user)
La vista queda muy limpia, y escribir un helper no es un gran problema, aunque no nos olvidemos de que estamos escribiendo también 3 parciales, en las que es probable que parte del código pueda reusarse de una a otra.
Pero el asunto puede,incluso suele, ser más complejo.
Supongamos que a mayores de las herramientas queremos que si un usuario está registrado se muestre algo del estilo “Bienvenido, Fulanito”, y además, si hace más de 10 días que no se conecta le escriba “Te echabamos de menos”, y si tiene un mensaje privado (y sólo si lo tiene) le aparezca un enlace a su buzón de entrada. Si es del un administrador le muestre una listade temas que aun no ha moderado, pero sólo de la sección del foro de la que es moderador, y el mismo mensaje de “Te echabamos de menos” si hace días que no se conecta. Si es el webmaster las estadísticas de ganancias de adSense y GoogleAnalytics, en enlace a su buzón si tiene correo nuevo, pero no se le saluda y si hace días que no se conecta un mensaje que diga “Tengo que trabajar más, la web nose mantiene sola”.
En este ejemplo rápido, hay muchas características que dependen de que tipo de usuario es, el tiempo que lleva sin conectarse, y otras circunstancias, y además algunas son comunes a varios pero no todos los tipos de usuarios. Si metemos condicionales en la vista para modelar todo esto, sí que Dios matará a un león.
Las celdas nos permiten extraer la funcionalidad a unmini-controlador, en la que cada acción encapsule un pedazo de funcionalidad y su representación, y además aprovechar características como la herencia para lograr un código lo más DRY posible. Los componentes se han de comportar como cajas negras en que tu las invocas, y ellos se encargan del resto.
Como de costumbre, para instalar la gema tan solo ponemos en el gemfile la linea gem 'cells', y...
Leer documento completo

Regístrate para leer el documento completo.

Estos documentos también te pueden resultar útiles

  • informatica y computacion
  • Computacion e informatica
  • Informatica y computacion
  • Informatica y Computacion
  • Informatica Y Computacion
  • Informatica y computacion
  • informatica y computacion
  • Informática Y Computación

Conviértase en miembro formal de Buenas Tareas

INSCRÍBETE - ES GRATIS