Forum: Rails-ES Problema con ActiveScaffold

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
6314bb12df090d88f3c74454304dd47e?d=identicon&s=25 Maria (Guest)
on 2007-04-19 13:56
Hola a todos, soy nueva con ROR y ActiveScaffold y tengo un problema:

Tengo 3 trablas: Ciudades, Casas y Personas. La primera esta relacionada
con la segunda y la segunda con la tercera.

Cuando visualizo la tabla casas, en cada fila, en el campo ciudad en vez
de mostrase el nombre de la ciudad a la que pertenece la casa, me
aparece esto: #<Ciudad:0xb779a448>
donde el numéro va cambiando.



Quería saber también si al visualizar la tabla personas, ademas de
visualizarse los atributos de las personas y la casa a la que
pertenecen, se puede visualizar también la ciudad a la que pertenecen.



Muchas gracias.
Ffd012d72e7f61639724878825ed25a3?d=identicon&s=25 Damian Janowski (djanowski)
on 2007-04-19 14:23
(Received via mailing list)
On 4/19/07, Maria <ruby-forum-incoming@andreas-s.net> wrote:
> Hola a todos, soy nueva con ROR y ActiveScaffold y tengo un problema:

Hola María, bienvenida!

> Tengo 3 trablas: Ciudades, Casas y Personas. La primera esta relacionada
> con la segunda y la segunda con la tercera.

Es más cool hablar de "modelos" ;)
Las tablas son un mecanismo de persistencia (o entre nosotros, un mal
necesario!)

> Cuando visualizo la tabla casas, en cada fila, en el campo ciudad en vez
> de mostrase el nombre de la ciudad a la que pertenece la casa, me
> aparece esto: #<Ciudad:0xb779a448>
> donde el numéro va cambiando.

Cuando hacés esto:

<%= casa.ciudad %>

Se está llamando implícitamente al método to_s sobre el objeto que vas
a imprimir. Por defecto, el método to_s devuelve el nombre de la clase
y la su dirección de memoria (no?). A mí me encanta sobreescribir este
método porque me parece mucho más DRY (Don't Repeat Yourself). Es
decir, es responsabilidad del modelo devolver una
representación"humana" (string) de sus datos:

class Ciudad < ActiveRecord::Base
  def to_s
    nombre
  end
end

Eso también se puede lograr con un alias_method, pero también podrías hacer:

def to_s
  "#{nombre}, #{pais}"
end

(suponiendo que hay una relación con países)


Espero que haya servido.

Saludos!
6314bb12df090d88f3c74454304dd47e?d=identicon&s=25 Maria (Guest)
on 2007-04-19 16:00
Muchas gracias,

el error que tenía ya está solucionado y entendido.


Me queda por entender, teniendo los 3 modelos, el primero relacionado
con el segundo y el segundo con el tercero, al visualizar la tabla
correspondiente al tercer modelo con ActiveScaffold cómo se puede
obtener, además de los atributos del tercer modelo y el atributo del
segundo momdelo con el que está realacionado, un campo del primer modelo
con el que está relacionado.




Damian Janowski wrote:
> On 4/19/07, Maria <ruby-forum-incoming@andreas-s.net> wrote:
>> Hola a todos, soy nueva con ROR y ActiveScaffold y tengo un problema:
>
> Hola Mar�a, bienvenida!
>
>> Tengo 3 trablas: Ciudades, Casas y Personas. La primera esta relacionada
>> con la segunda y la segunda con la tercera.
>
> Es m�s cool hablar de "modelos" ;)
> Las tablas son un mecanismo de persistencia (o entre nosotros, un mal
> necesario!)
>
>> Cuando visualizo la tabla casas, en cada fila, en el campo ciudad en vez
>> de mostrase el nombre de la ciudad a la que pertenece la casa, me
>> aparece esto: #<Ciudad:0xb779a448>
>> donde el num�ro va cambiando.
>
> Cuando hac�s esto:
>
> <%= casa.ciudad %>
>
> Se est� llamando impl�citamente al m�todo to_s sobre el objeto que vas
> a imprimir. Por defecto, el m�todo to_s devuelve el nombre de la clase
> y la su direcci�n de memoria (no?). A m� me encanta sobreescribir este
> m�todo porque me parece mucho m�s DRY (Don't Repeat Yourself). Es
> decir, es responsabilidad del modelo devolver una
> representaci�n"humana" (string) de sus datos:
>
> class Ciudad < ActiveRecord::Base
>   def to_s
>     nombre
>   end
> end
>
> Eso tambi�n se puede lograr con un alias_method, pero tambi�n podr�as hacer:
>
> def to_s
>   "#{nombre}, #{pais}"
> end
>
> (suponiendo que hay una relaci�n con pa�ses)
>
>
> Espero que haya servido.
>
> Saludos!
Ffd012d72e7f61639724878825ed25a3?d=identicon&s=25 Damian Janowski (djanowski)
on 2007-04-19 16:06
(Received via mailing list)
On 4/19/07, Maria <ruby-forum-incoming@andreas-s.net> wrote:
> Me queda por entender, teniendo los 3 modelos, el primero relacionado
> con el segundo y el segundo con el tercero, al visualizar la tabla
> correspondiente al tercer modelo con ActiveScaffold cómo se puede
> obtener, además de los atributos del tercer modelo y el atributo del
> segundo momdelo con el que está realacionado, un campo del primer modelo
> con el que está relacionado.

Dos opciones:

<%= persona.casa.ciudad %>

O algo más relacionado al modelo de datos:

class Persona < ActiveRecord::Base
  belongs_to :casa

  def ciudad
    casa.ciudad unless casa.nil?
  end
end

Y luego

<%= persona.ciudad %>

En este caso creo que la segunda opción es más correcta.

Saludos!
6314bb12df090d88f3c74454304dd47e?d=identicon&s=25 Maria (Guest)
on 2007-04-19 16:23
Pero no lo puedo hacer desde el controlador?

Ahora hago desde el controlador de personas:


config.columns = [:nombre, :apellido, :casa]


Gracias.



Damian Janowski wrote:
> On 4/19/07, Maria <ruby-forum-incoming@andreas-s.net> wrote:
>> Me queda por entender, teniendo los 3 modelos, el primero relacionado
>> con el segundo y el segundo con el tercero, al visualizar la tabla
>> correspondiente al tercer modelo con ActiveScaffold c�mo se puede
>> obtener, adem�s de los atributos del tercer modelo y el atributo del
>> segundo momdelo con el que est� realacionado, un campo del primer modelo
>> con el que est� relacionado.
>
> Dos opciones:
>
> <%= persona.casa.ciudad %>
>
> O algo m�s relacionado al modelo de datos:
>
> class Persona < ActiveRecord::Base
>   belongs_to :casa
>
>   def ciudad
>     casa.ciudad unless casa.nil?
>   end
> end
>
> Y luego
>
> <%= persona.ciudad %>
>
> En este caso creo que la segunda opci�n es m�s correcta.
>
> Saludos!
Ffd012d72e7f61639724878825ed25a3?d=identicon&s=25 Damian Janowski (djanowski)
on 2007-04-19 18:25
(Received via mailing list)
On 4/19/07, Maria <ruby-forum-incoming@andreas-s.net> wrote:
> Pero no lo puedo hacer desde el controlador?
>
> Ahora hago desde el controlador de personas:
>
>
> config.columns = [:nombre, :apellido, :casa]
>
>
> Gracias.

Con la segunda opción que te dije, agregando el método ciudad, podrías hacer:

config.columns = [:nombre, :apellido, :casa, :ciudad]
6314bb12df090d88f3c74454304dd47e?d=identicon&s=25 Maria (Guest)
on 2007-04-20 09:38
Muchas gracias por todo,


Ya que veo que sabes mucho de esto te pregunto una úlima cosa, porque
estoy bastante perdida.



Permite el ActiveScaffold hacer codas del estilo de:


Por ejemplo, en la prueba que estoy haciendo tengo 3 modelos en la base
de datos: CIUDAD relacionado con CASA (relación 1-n) este relacionado
con PERSONA (relación 1-n).

Cuando voy a insertar o editar una nueva persona tengo que seleccionar
una casa. Puede pasar que tenga varias casas iguales que pertenezcan a
diferente ciudad.
En este caso a mi se me ocurren dos opciones:

-Que se me muestre en el ascensor donde selecciono la casa, en vez de
sólo el nombre de la casa el nombre de la ciudad+el nombre de la casa.
Al seleccionar una casa que esta en una ciudad, se me relacionará la
persona con esa casa que está en dicha ciudad.

-Que tenga dos asensores, uno con las ciudades y otro con las casas. Si
selecciono una ciudad, se refrescara el ascensor de las casas y
aparecerán solo las casas que pertenecen a esta ciudad. Si hubiera
elegido una casa, en el ascensor de las ciudades se me quedaría
seleccionado el nombre de la ciudad.


No se si es posible hacer estas cosas con ActiveScaffold, es algo que se
puede necesitar hacer en cualquier momento.



Otra cosa, conoces algún libro de ROR que trate sobre ActiveScaffold (o
la versión anterior, AjaxScaffold)? Qué libro me recomiendad para
aprender ROR. Yo ahora estoy usando "Agile Web development with Rails"


Muchas gracias por todo.
Ffd012d72e7f61639724878825ed25a3?d=identicon&s=25 Damian Janowski (djanowski)
on 2007-04-20 15:02
(Received via mailing list)
On 4/20/07, Maria <ruby-forum-incoming@andreas-s.net> wrote:
>
> -Que se me muestre en el ascensor donde selecciono la casa, en vez de
> sólo el nombre de la casa el nombre de la ciudad+el nombre de la casa.
> Al seleccionar una casa que esta en una ciudad, se me relacionará la
> persona con esa casa que está en dicha ciudad.

En reaildad nunca usé ActiveScaffold. Solamente vi un poco de
AjaxScaffold pero no en profundidad.

Así que la solución más rápida me parece hacer algo parecido a lo anterior:

def nombre_completo
  [ciudad, nombre].compact.join(' - ')
end

Y luego en la lista utilizás el método nombre_completo.

Espero que haya servido!

Saludos@
2a249fa78dc7b2215068cb8a97e577eb?d=identicon&s=25 Manu Campos (Guest)
on 2007-04-24 13:55
(Received via mailing list)
Con ActiveScaffold, habria que declarar antes un metodo to_label, mejor
que
reescribir el metodo to_s. de la documentacion de activescaffold:

to_label

"When ActiveScaffold needs to present a string description of a
record, it searches through a common list of record properties looking
for something that responds. The search set, in order, is: :to_label,
:name, :label, :title, and finally :to_s. So if your schema already
has one of those fields, it'll be automatically used. But you can
always define a to_label method to customize the string description."


Saludos.

El 19/04/07, Damian Janowski <damian.janowski@gmail.com>
escribió:
>
6314bb12df090d88f3c74454304dd47e?d=identicon&s=25 Maria (Guest)
on 2007-04-26 10:05
Tengo 3 trablas: Ciudades, Casas y Personas. La primera esta relacionada
con la segunda y la segunda con la tercera.


Sí, ya he visto en la documentación lo del to_label. Muchas gracias por
la ayuda.

Lo que no entiendo es una cosa. Con lo que me dijiste, cuando visualizo
las personas me aparecen también la ciudad a la que pertenecen, pero no
puedo ordenar por ese campo. Según he visto en la documentación, creo
que tengo que usar sort o/y sort_by, y la verdad es que no me entero
mucho.

Lo que no entiendo es porque no puedo ordenar por ese campo, si ya tiene
todos los datos, no?



Manu Campos wrote:
> Con ActiveScaffold, habria que declarar antes un metodo to_label, mejor
> que
> reescribir el metodo to_s. de la documentacion de activescaffold:
>
> to_label
>
> "When ActiveScaffold needs to present a string description of a
> record, it searches through a common list of record properties looking
> for something that responds. The search set, in order, is: :to_label,
> :name, :label, :title, and finally :to_s. So if your schema already
> has one of those fields, it'll be automatically used. But you can
> always define a to_label method to customize the string description."
>
>
> Saludos.
>
> El 19/04/07, Damian Janowski <damian.janowski@gmail.com>
>escribi�:
>
95350322d6aa91c2f05fcc982da29a77?d=identicon&s=25 unknown (Guest)
on 2007-04-27 12:03
(Received via mailing list)
Hola,
estoy empezando a conocer ActiveScaffold. Me gusta y quiero utilizarlo.
En un modelo tengo un tipo de datos enum. Me gustaría que a la hora de
editarlo o crearlo, me aparecíera un combobox con las opciones del enum.
Cómo puedo hacer eso??? ahora mismo me sale como un campo de texto.
Saludos y gracias por adelantado.
Ana
6314bb12df090d88f3c74454304dd47e?d=identicon&s=25 Maria (Guest)
on 2007-04-27 12:36
Por ejemplo, si tienes el modelo persona y dentro de esta el atributo
ciudad_nacimiento.

En el controlador de persona pones:

config.columns[:ciudad_nacimiento].ui_type = :select


Y te saldrá ciudad_nacimiento como un combobox.






unknown wrote:
> Hola,
> estoy empezando a conocer ActiveScaffold. Me gusta y quiero utilizarlo.
> En un modelo tengo un tipo de datos enum. Me gustar�a que a la hora de
> editarlo o crearlo, me aparec�era un combobox con las opciones del enum.
> C�mo puedo hacer eso??? ahora mismo me sale como un campo de texto.
> Saludos y gracias por adelantado.
> Ana
95350322d6aa91c2f05fcc982da29a77?d=identicon&s=25 unknown (Guest)
on 2007-04-27 13:13
(Received via mailing list)
Gracias Maria,
eso ya lo había probado y no me funciona.
He comprobado que no me funciona lo de ui_type tampoco con :text_area,
ni
con ningún otro tipo. Siempre me muestra un textfield.
Qué puedo tener mal???
Este tipo de cosas que deberían ser tan sencillas, me desesperan cuando no
funcionan...
Afe765ee2d37bd6ad7e55d6f5fd35f1e?d=identicon&s=25 Hernan Fernandez (Guest)
on 2007-04-27 15:03
(Received via mailing list)
Hola
el tipo enum no es soportado por ActiveRecord, si puedes modificar la
definicion de la tabla debería modificarla para usar una tabla "comun"
id ->
option. Si no puedes modificarla hay un plugin para usar enums[1], nunca
lo
he usado pero puedes probarlos no parece nada complicado.


[1] - http://enum-column.rubyforge.org/

Saludos
Hernán Fernandez
netflux.com.ar
3aa5406a34fd4d0a634d520a5c0d3fdb?d=identicon&s=25 Ernesto Chávez (czyx)
on 2007-11-06 05:57
Damian Janowski wrote:
> On 4/19/07, Maria <ruby-forum-incoming@andreas-s.net> wrote:
>> Hola a todos, soy nueva con ROR y ActiveScaffold y tengo un problema:
>
> Hola Mar�a, bienvenida!
>
>> Tengo 3 trablas: Ciudades, Casas y Personas. La primera esta relacionada
>> con la segunda y la segunda con la tercera.
>
> Es m�s cool hablar de "modelos" ;)
> Las tablas son un mecanismo de persistencia (o entre nosotros, un mal
> necesario!)
>
>> Cuando visualizo la tabla casas, en cada fila, en el campo ciudad en vez
>> de mostrase el nombre de la ciudad a la que pertenece la casa, me
>> aparece esto: #<Ciudad:0xb779a448>
>> donde el num�ro va cambiando.
>
> Cuando hac�s esto:
>
> <%= casa.ciudad %>
>
> Se est� llamando impl�citamente al m�todo to_s sobre el objeto que vas
> a imprimir. Por defecto, el m�todo to_s devuelve el nombre de la clase
> y la su direcci�n de memoria (no?). A m� me encanta sobreescribir este
> m�todo porque me parece mucho m�s DRY (Don't Repeat Yourself). Es
> decir, es responsabilidad del modelo devolver una
> representaci�n"humana" (string) de sus datos:
>
> class Ciudad < ActiveRecord::Base
>   def to_s
>     nombre
>   end
> end
>
> Eso tambi�n se puede lograr con un alias_method, pero tambi�n podr�as hacer:
>
> def to_s
>   "#{nombre}, #{pais}"
> end
>
> (suponiendo que hay una relaci�n con pa�ses)
>
>
> Espero que haya servido.
>
> Saludos!



Hola algo muy parecido me ha sucedido pero lo he solucionado definiendo
dentro de mi modelo def to_s, al intentar mostrar el id de un
determinada tabla lo que obtengo en la celda correspondiente es lo
siguiente:
ame, label, title, to_s

Alguien por favor me puede dar una mano? De antemano muchas gracias!
1e0fce0b6a4bc9b682b67b4d7b43b17b?d=identicon&s=25 Rafael García (rafa)
on 2007-11-06 11:52
(Received via mailing list)
Attachment: rgo.vcf (252 Bytes)
Ernesto Chávez aliaga escribió:
>>> con la segunda y la segunda con la tercera.
>>>
>>
>> end
>
> Hola algo muy parecido me ha sucedido pero lo he solucionado definiendo
> dentro de mi modelo def to_s, al intentar mostrar el id de un
> determinada tabla lo que obtengo en la celda correspondiente es lo
> siguiente:
> ame, label, title, to_s
>
> Alguien por favor me puede dar una mano? De antemano muchas gracias!
>
Si por ejemplo quieres mostrar el id en los listados, debes poner en la
configuración de AS(dentro del bloque):

    config.list.columns.add :id


La línea anterior lo añade al final, si lo quieres al principio(o en una
posición determinada) y que salga en todas las  acciones, deberías
especificar las columnas visibles:

config.columns = [:id, :col1, :col2, ...]

Si solo lo quieres en el listado:

config.list.columns = [:id, :col1, :col2, ...]

Saludos!
3aa5406a34fd4d0a634d520a5c0d3fdb?d=identicon&s=25 Ernesto Chávez (czyx)
on 2007-11-06 15:39
Rafael García wrote:
> Ernesto Chávez aliaga escribió:
>>>> con la segunda y la segunda con la tercera.
>>>>
>>>
>>> end
>>
>> Hola algo muy parecido me ha sucedido pero lo he solucionado definiendo
>> dentro de mi modelo def to_s, al intentar mostrar el id de un
>> determinada tabla lo que obtengo en la celda correspondiente es lo
>> siguiente:
>> ame, label, title, to_s
>>
>> Alguien por favor me puede dar una mano? De antemano muchas gracias!
>>
> Si por ejemplo quieres mostrar el id en los listados, debes poner en la
> configuración de AS(dentro del bloque):
>
>     config.list.columns.add :id
>
>
> La línea anterior lo añade al final, si lo quieres al principio(o en una
> posición determinada) y que salga en todas las  acciones, deberías
> especificar las columnas visibles:
>
> config.columns = [:id, :col1, :col2, ...]
>
> Si solo lo quieres en el listado:
>
> config.list.columns = [:id, :col1, :col2, ...]
>
> Saludos!

Primero que nada le agradezco por su tiempo y le comento que soy
relativamente nuevo en el tema de RoR. A continuación le describo de
manera mucho mas detallada mi situación.
tengo 2 modelos y dos controladores

modelo cliente
modelo contrato

Para ambos estoy usando activescaffold.
los atributos dentro de mi base de datos son los siguientes
  clientes.
    nombre
    direccion
    telefono
  contratos.
    cliente_id
    otros atributos
Dentro de los modelos he declarado lo siguiente para las relaciones
  modelo cliente.
    has_many :contrato
          def to_s
                  nombre
    end
  modelo contrato.
    belongs_to :cliente

Al ver el listado de contratos todo va bien. obtengo ademas de los datos
del contrato
el nombre del cliente asociado al contrato.

Sin embargo al intentar mostrar el id del contrato el el listado de
clientes
obtengo lo siguiente en el campo que corresponde al contrato

#<Contrato:0xb75c1450>, #<Contrato:0xb75c1130>

al definir en el modelo contrato lo siguiente
   def to_s
                id
  end

obtengo en el campo contrato lo siguiente name, label, title, to_s,
name, label, title, to_s

Como hago para poder ver el id del contrato dentro del listado de
clientes?
Muchas gracias por su tiempo.
1e0fce0b6a4bc9b682b67b4d7b43b17b?d=identicon&s=25 Rafael García (rafa)
on 2007-11-06 23:39
(Received via mailing list)
Attachment: rgo.vcf (252 Bytes)
Ernesto Chávez aliaga escribió:
>>> dentro de mi modelo def to_s, al intentar mostrar el id de un
>>     config.list.columns.add :id
>> config.list.columns = [:id, :col1, :col2, ...]
> modelo contrato
> Dentro de los modelos he declarado lo siguiente para las relaciones
> el nombre del cliente asociado al contrato.
>   end
>
> obtengo en el campo contrato lo siguiente name, label, title, to_s,
> name, label, title, to_s
>
> Como hago para poder ver el id del contrato dentro del listado de
> clientes?
> Muchas gracias por su tiempo.
>
>
En mis modelos para cambiar su salida redefino el método name pero por
lo que he comprobado es lo mismo (debo mirar el porque):

  def name
     "#{id}"
  end

Además, fíjate que estoy poniéndolo entre comillas, así sí te mostrará
el id del contrato.

Saludos!
This topic is locked and can not be replied to.