Rails: helpers con bloques
Visita este artículo en http://www.estadobeta.com/2007/06/11/rails-helpers-con-bloques/
Por Ismael en Ruby & Rails, artículos, tipsPongamos un ejemplo. Estas haciendo una aplicación Rails donde los usuarios autorizados (”logueados”) puedes ver algunas cosas en las páginas que el resto de los usuarios no pueden. Hay varias formas de solucionarlo. Supongamos que en tu controlador base defines un objeto @user que estará presente en todas las páginas. Al Usuario le defines un método is_logged? para saber si hay un usuario registrado. Así es fácil agregar secciones de HTML dependiendo del estado del usuario.
-
-
< % if @user.is_logged? %>
-
<div class="admin_area"
Bloques
Pero claro, cada vez que queramos agregar esta “admin_area” a nuestras vistas tendremos que duplicar esa condición. La cosa se pone pero aún si en el futuro queremos extender el sistema de permisos.
Ruby y sus Bloques al rescate. ¿Han visto el nuevo helper para formularios de Rails 1.2?Code (ruby)-
-
< % form_tag :action=>’/una/accion’ do %>
-
<input type="text" name="nombre" />
-
<input type="submit" value="Guardar" />
-
< % end %>
-
El helper recibe RHTML dentro de un bloque, y lo rodea con las etiquetas
<form action="/una/accion" method="post">y</form>.Resulta que podemos usar la misma metodología para nuestros fragmentos de administración; algo como así:
Code (ruby)Este Helper no sólo evaluaría si el Usuario (@user) está registrado sino que podría rodear el bloque con una etiqueta HTML común a todos los fragmentos de administración, en este caso
<div clas="admin_area">y</div>.Veamos la implementación (normalmente en /app/helpers/application.rb o otro Helper).
Code (ruby)-
-
def admin_area(&block)
-
return ” unless @user and @user.is_logged?
-
concat( ‘<div class="admin_area">’, block.binding )
-
yield
-
concat( "</div>", block.binding )
-
end
-
Ahí está- Nuestro helper
admin_arearecibe un bloque (en este caso un fragmento de RHTML). Si no existe un usuario registrado, retorna un string vacío. Si el usuario está registrado, retorna el fragmento de RHTML rodeado de un DIV u otros fragmentos comunes (cuando un método Ruby recibe un bloque como parámetro,yieldinvoca y retorna ese bloque).concatconcatena nuestro DIV con el contenido del bloque (quien quiera explicar esto con más detalle, sientase libre de hacerlo en los comentarios).Más usuarios
Pero ahora nuestro sistema de usuarios soporta varios niveles. En el objeto @user definimos un atributo “nivel” que nos dice si el usuario es “administrador”, “editor” o “invitado”. La idea es usar nuestro Helper de la siguiente manera:
Code (ruby)Ahora el Helper recibe un símbolo que representa el nivel de administración del usuario registrado. Nuestro Helper se encarga de revisar que el usuario tenga el nivel apropiado.
Code (ruby)-
-
def admin_area(nivel=:administrador, &block)
-
return ” unless @user and @user.is_logged? and @user.nivel = nivel.to_s
-
#
-
-
concat( ‘<div class="admin_area">’, block.binding )
-
yield
-
concat( "</div>", block.binding )
-
end
-
Por supuesto, el ejemplo se puede seguir elaborando o extender a otros usos.
Fuente: “Blocks in views“, en RailsCasts.
- Servicios:
- Comentarios RSS
- Menear!
- Del.icio.us
-

6/11/2007 at 9:18 pm
Que buena, estaba “cabeceando” el manejo de niveles de usuarios y esto ayuda muchisimo.
Por otro lado, RailsCasts idea mia o cada vez mejora mas sus entregas?… se ha convertido sin duda en “must visit if you want to learn rails”.
6/12/2007 at 12:17 am
Si, hoy le dediqué 30 hora a ver todos los pendientes y en verdad es un gran aporte.
6/18/2007 at 3:11 pm
Hola Ismael ,alguna documentación o libro de ruby on rails en Español que recomiendes para desarrollar.
6/18/2007 at 5:01 pm
Bedomax
No, aunque no he buscado en español tpco. Si te animas con el inglés el libro “oficial” de Rails es ultra-recomendable. Rails está escrito en Ruby, así que es buena idea empezar aprendiendo Ruby primero. Otra cosa que es útil para entender la arquitectura de Rails (y MVC en general) es leer cualquier cosa sobre Patrones de Diseño, no necesariamente sobre Ruby o Rails. PHP 5 Objects, Patterns and Practice me sirvió muchísimo a mi que, como muchos venía desde el mundo de PHP.
Por último, una vez que manejas lo básico de Rails te puede interesar aprender un par de recetas para condimentar tu estilo de desarrollo. En síntesis: lo mejor que se puede hacer para aprender Rails es entender los conceptos que lo sustentan (Orientación a Objectos, MVC) y la terminología (COntroladores, Modelos, Vistas, Helpers) antes de perderse en los detalles.
6/19/2007 at 4:06 pm
En sobrerailes.com hay un articulo introductorio de Ruby on Rails traducido al español.
El original es este articulo de oreilly.
9/24/2007 at 5:48 pm
Buscando en la api de rails, consegui una manera un poco mas intuitiva de hacer las cosas, por ejemplo:
Supongamos un generador de formularios con estilo basado en tablas.
def app_form_table1(&block)
code = ”
code << capture(&block)
code << ”
concat(code, block.binding)
end
capture atrapa el codigo del bloque en una variable y por supuesto ejecuta el codigo de ruby contenido en el, y concat permite mostrar en la vista el codigo generado, que en este caso remplazara al bloque.
Para mayor informacion ver la api de rails.
Saludos
9/24/2007 at 5:53 pm
Buscando en la api de rails, consegui una manera un poco mas intuitiva de hacer las cosas, por ejemplo:
Supongamos un generador de formularios con estilo basado en tablas.
def app_form_table1(&block)
code = ‘….codigo….’
code << capture(&block)
code << ‘….codigo….’
concat(code, block.binding)
end
capture atrapa el codigo del bloque en una variable y por supuesto ejecuta el codigo de ruby contenido en el, y concat permite mostrar en la vista el codigo generado, que en este caso remplazara al bloque.
Para mayor informacion ver la api de rails.
Saludos