hola,
Me gustaría crear un panel lateral para una aplicación donde se
muestren los últimos contactos creados, promociones destacadas, etc.
Cual sería la mejor manera de pintar este panel?? He intentado hacerlo
mediante partial, pero no me queda claro el acceso a los datos de los
diferentes controladores, por un lado estarían los contactos y por
otro las promociones.
yo veo, por lo menos, dos soluciones razonables. Filtros y helpers.
Te cuento primero la de los filtros.
para cada zona que vayas a pintar en tu sidebar me crearía un partial,
pongamos que tenemos dos ‘_recent_contacts’ y ‘_promotions’. Dentro de
_recent_contacts leerías de una variable @recent_contacts y dentro de
_promotions de una @promotions. Por aquello de dejarlo limpio, si
necesitases tener múltiples variables para uno de los partials te
sugeriría que tu variable de instancia sea una hash donde metes lo que
te haga falta @recent_contacts[:contact_list] @recenr_contacts[:type],
etc… así cada partial te depende de una única variable de instancia y
te queda todo encapsulado y reusable.
Además, te creas tu partial de sidebar, que lo que tiene es el html que
necesites y las llamadas a estos partials.
Ahora, lo que te falta es cargar esas variables de instancia… pues
nada… te haces un método por cada partial que se llame
prepare_loquesea, así que tienes dos métodos : prepare_recent_contacts
y prepare_promotions. Cada uno de ellos hace lo que tenga que hacer y
finalmente carga su variable de instancia correspondiente.
Lo siguiente que necesitas es un método que se llame prepare_sidebar que
llama a todos esos prepare que has definido.
Ahora, en cada acción en la que vayas a pintar el sidebar, le pones un
before_filter :prepare_sidebar.
Eso te lo deja todo bastante apañado.
En la opción de helpers la división en partials es idéntica, pero en
este caso en lugar de definirte métodos en el controller y un filtro, lo
que te defines son los métodos prepare_loquesea para cada partial como
un helper, y luego dentro del helper en tu primera línea llamas al
prepare correspondiente.
Esta segunda opción tiene sus ventajas, como que por ejemplo no tienes
que preocuparte de definir la llamada (con los excepts y only) en tu
controller. A cambio, a mí personalmente no me gusta demasiado meter
mucha lógica en los helper, aunque si son sólo unas queries que además
se invocarán directamente sobre el modelo no lo veo mal.
saludos,
javier ramírez