Panel lateral en la aplicación

Saludos,

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.
Por ejemplo, yo había creado una acción en ContactsController llamada
ultimos, que me mostraba los últimos 5 contactos creados, ahora bien,
como
lo hago para mostrarlo en el panel lateral del layout?

Muchas gracias,

Depende de como funcione la aplicación pero, a priori, yo pondria
“todo eso” en la
sesión.
2008/2/5 Antonio R. [email protected]:

On Feb 5, 2008, at 12:33 PM, Antonio R. wrote:

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.
Por ejemplo, yo había creado una acción en ContactsController
llamada ultimos, que me mostraba los últimos 5 contactos creados,
ahora bien, como lo hago para mostrarlo en el panel lateral del
layout?

No es necesario que lo pienses en terminos de controladores. Teniendo
las cosas encapsuladas en el modelo a distancia de una llamada:

@most_recent_contacts = @current_user.most_recent_contacts
@best_promotions = Promotion.best_ones

una opcion sencilla es tener eso en un before_filter.

– fxn

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

por cierto… en la opción de usar un filtro, siempre puedes hacer que
cada acción de prepare haga directamente el render del partial a una
string que guardas como variable de instancia y que luego pintas
directamente en el partial de tu sidebar. Es básicamente lo mismo sólo
que dejas el render en el controller en lugar de en el partial. Es lo
que se hace con los famosos @content_for_xxxx de los layouts

Perdonad, es una duda creo que bastante básica pero he estado buscando y
no
la he encontrado; el método prepare_sidebar que llama a los otros dos
prepare lo he colocado en el application.rb, pero como he de hacer para
llamar a esos métodos??

2008/2/5 javier ramirez [email protected]:

el before_filter ya lo tengo, es decir en el application.rb queda:

before_filter :prepare_sidebar

def prepare_sidebar
prepare_recent_contacts
prepare_starred_promotions
end

Lo que no se si estoy haciendo bien la llamada dentro del
prepare_sidebar a
los demás métodos prepare.

Merci,

2008/2/14 javier ramirez [email protected]:

Hola,

Perdonad, es una duda creo que bastante básica pero he estado buscando
y no la he encontrado; el método prepare_sidebar que llama a los otros
dos prepare lo he colocado en el application.rb, pero como he de hacer
para llamar a esos métodos??

pues… como te decíamos xavier y yo mismo, con un before_filter. Si
quisieras que todas las acciones llevasen la sidebar, lo pondráis
directamente en el application controller tal que así
before_filter :prepare_sidebar

Si sólo quieres que lo usen algunas acciones, tendrías que ir a cada
controller donde lo quieras usar y aplicar el before_filter
selectivamente.

Si todavía no usas filtros en rails, te estás perdiendo mucho. Te
recomiendo que le eches un vistazo a esa parte.

saludos,

javier ramírez

buenas,

def prepare_sidebar
prepare_recent_contacts
prepare_starred_promotions
end

Lo que no se si estoy haciendo bien la llamada dentro del
prepare_sidebar a los demás métodos prepare.

si esos métodos están visibles (es decir, también en el application
controller) los estás llamando, s