sábado, 21 de marzo de 2009

Lipsiadmin y Rails: campos belongs_to

Lipsiadmin no ofrece manejo automático de campos relacionales, como belongs_to.

El autor, Davide D'Agostino se escuda en que no es predecible el contenido a mostrar del objeto enlazado. Podría usar un método como .to_s o cualquier otro para uso exclusivo de Lipsiadmin, pero no ha tomado en cuenta esa posibilidad. Así que lo único que propone es añadir a mano el código necesario.

Los cambios no son muchos, pero automatizado estaría mejor.

Entrando al tema, los cambios serían los siguientes:

Como ejemplo, parto de una tablas de clasificaciones que incluye una categoría y una división, ambos en sendas tablas, relacionadas mendiante belongs_to.

Para incluir el campo en el listado, hay que modificar al controlador de clasificaciones de backend en el método index las líneas (2ª y 3ª):


return_data[:clasificaciones] = clasificaciones.collect{|u| { :id => u.id,
:categoria_id => u.categoria.abrev,
:division_id => u.division.abrev,
:equipo => u.equipo,
:posicion => u.posicion,
:jugados => u.jugados,
:ganados => u.ganados,
:empatados => u.empatados,
:perdidos => u.perdidos,
:favor => u.favor,
:contra => u.contra,
:bonus => u.bonus,
:puntos => u.puntos,
:created_at => u.created_at,
:updated_at => u.updated_at } }



En la vista index.js.erb de backend/clasificaciones, habría que añadir la información a las variable items y el parámetro columns del grid


var items = [
{name: 'categoria_id'},
{name: 'division_id'},
...



columns: [
selections,
{
header: 'Categoria',
sortable: false,
dataIndex: 'categoria_id'
},{
header: 'División',
sortable: false,
dataIndex: 'division_id'
},{
...


Para incluir una lista desplegable en el formulario, hay que añadir al parcial _form:

%li
%label Categoría
=select :clasificacion, :categoria_id, Categoria.find(:all).collect{|c| [c.to_s, c.id]}, {:include_blank => false, :selection => @clasificacion.categoria_id}


Similar para la división.

Si tengo tiempo, o si alguien quiere, puede intentar incluir esta posibilidad a Lipsiadmin y remitir la solución como un parche a Davide D'Agostino.

Saludos.
 
javascript:void(0)