Forum: Rails-ES Attribute Accessor falla en la vista

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.
Jaime M. (Guest)
on 2007-06-01 03:37
En el modelo :

class Producto < ActiveRecord::Base

  def cospro
    read_attribute(:cospro) * read_attribute(:unidades)
  end

end

En la consola funciona cómo se espera (cospro == 30.00 y unidades == 10)
:

>> p = Producto.find(1)
>> puts p.cospro
300.0

Pero en la vista no es así :

<%= text_field 'producto', 'cospro', :maxlength => 12  %>

El control text_field contiene 30.00 cuando se esperaba 300.00. Cuál es
la razón ?, ó estoy entiendo mal el concepto.

De antemano gracias por la ayuda
Saludos
---
Jaime Mora R.
Damian J. (Guest)
on 2007-06-01 06:45
(Received via mailing list)
On 5/31/07, Jaime Mora R. <removed_email_address@domain.invalid>
wrote:
> En la consola funciona cómo se espera (cospro == 30.00 y unidades == 10)
>
> Pero en la vista no es así :
>
> El control text_field contiene 30.00 cuando se esperaba 300.00. Cuál es
> la razón ?, ó estoy entiendo mal el concepto.

Fresquísimo tu problema...

http://groups.google.com/group/rubyonrails-core/br...
Daniel R. Troitiño (Guest)
on 2007-06-01 11:09
(Received via mailing list)
On 6/1/07, Jaime Mora R. <removed_email_address@domain.invalid> wrote:
> En la consola funciona cómo se espera (cospro == 30.00 y unidades == 10)
> El control text_field contiene 30.00 cuando se esperaba 300.00. Cuál es
> la razón ?, ó estoy entiendo mal el concepto.
>
> De antemano gracias por la ayuda
> Saludos
> ---
> Jaime Mora R.
>

La solución "sencilla" parece ser utilizar un nombre diferente para el
método y para el atributo, para así obligar a Rails a utilizar sólo tu
método. Pero la verdad es que es uno de los comportamientos en Rails
más raros que recuerdo.
Jaime M. (Guest)
on 2007-06-01 20:15
Damian J. wrote:
>
> Fresquí³©mo tu problema...
>
> 
http://groups.google.com/group/rubyonrails-core/br...

Primeramente gracias Damian, muy oportuno.

En este hilo en el core, lo resumo (corregir si me equivoco) de esta
manera :

1. Este comportamiento es intencional, algunas de las razones
validates_numericality_of

2. Que el overriding de los accessors, no trabaja automáticamente.

3. Los documentos mienten, ya que dicen que trabajan.

4. En muchas situaciones lo único que se desea es formatear la salida :

<%= text_field :person, :name, :formatter => :random -%>


 class Person < ActiveRecord::Base


   def random(value)
      value.upcase * 4
   end


 end

5. Utilizar atributos virtuales.

Saludos.
---
Jaime Mora R.
Jaime M. (Guest)
on 2007-06-01 20:52
Daniel R. Troitiño wrote:

> La solució® ¦quot;sencilla" parece ser utilizar un nombre diferente para el
> mé´¯do y para el atributo, para así ¯bligar a Rails a utilizar s󬯠tu
> mé´¯do. Pero la verdad es que es uno de los comportamientos en Rails
> má³ raros que recuerdo.

Gracias Daniel por contestar.

Rails 1.2 incorporó el uso de alias a métodos (alias_attribute) :

<%= text_field 'producto', 'my_cospro' %><br/>

class Producto < ActiveRecord::Base

  alias_attribute :my_cospro, :cospro

  def my_cospro
    read_attribute(:cospro) * read_attribute(:unidades)
  end


end

Saludos
---
Jaime Mora R.
Daniel R. Troitiño (Guest)
on 2007-06-01 23:46
(Received via mailing list)
On 6/1/07, Jaime Mora R. <removed_email_address@domain.invalid> wrote:
>
>
>
>  class Person < ActiveRecord::Base
>
>
>    def random(value)
>       value.upcase * 4
>    end
>
>
>  end

Creo que esto es una propuesta y no existe en Rails (no lo encuentro
en 1.2.3, ni en Edge).
Gil G. (Guest)
on 2007-06-03 09:09
(Received via mailing list)
Que tal !. la situacion es la siguiente:
Se pretende crear una aplicacion para dar de alta animales que lleguen a
un
zoologico, cabe destacar que los animales recibidos pueden ser entregado
por
un donante voluntario o pueden haber sido regogidos en algun decomiso,
para
esto pense en los siguientes modelos:

animal.rb: que tiene los datos generales del animal.

institucion.rb.: que contiene los datos de la instucion q realizo el
decomiso por el cual fue entregado el anima al zoologico.

decomiso.rb:que contiene la informacion del decomiso ligada a la
institcion
ademas de informacion extra como la persona de la institucion q la
entrego,
etc.

donante.rb.-que contiene los datos de la persona q tenia el animal y
decidio
donarlo.

Lo que prentendo hacer es que en una sola accion se den de alta todos
los
datos(excepto los datos de la institucion que se deben de dar de alta
desde
antes).

Lo que creo que debo de hacer es recibir todos los objetos y guardarlos,
pero como hago para que no se guarden hasta que todos cumplan las
condiciones establecidas en los modelos como presencia de algunos
campos,
etc.

No se si me logre dar a entender, pero a groso modo lo que pretende es
no
gurdar nada hasta que se cumplan todas las condiciones de los modelos.

Gracias de antemano! espero haber podido darme a entender.

_________________________________________________________________
Nuevo Messenger www.prodigy.msn.com Windows Live Messenger en
Prodigy/MSN
Jaime I. (Guest)
on 2007-06-03 09:50
(Received via mailing list)
El 3/06/07, salvador zalapa <removed_email_address@domain.invalid>
escribió:> Lo que creo que debo de hacer es recibir todos los objetos y 
guardarlos,
> pero como hago para que no se guarden hasta que todos cumplan las
> condiciones establecidas en los modelos como presencia de algunos campos,
> etc.

Hola Salvador, para eso existe los validates_presence_of y otras
validaciones en los modelos...
Gil G. (Guest)
on 2007-06-03 22:17
(Received via mailing list)
Si estoy de acuerdo Jaime, pero lo que yo deseo es que al momento de
recibir
por ejemplo en mi contrador:

Animal=new Animal(params[:animal])
Decomiso=new Decomiso(params[:decomiso])
Donante=new Donante(params[:donante])

Y lo que yo quiero es q no se guarde nada de ningun modelos hasta que se
satisfagan los requerimientos de los tres modelos.

SUpongo q debe ser falcil y me estoy complicando la vida pero las pequeñas
aplicaciones que he hecho solo recibo un objeto y pues no he tenido
problemas.

GRacias !



> > condiciones establecidas en los modelos como presencia de algunos
>Ror-es mailing list
>removed_email_address@domain.invalid
>http://lists.simplelogica.net/mailman/listinfo/ror-es

_________________________________________________________________
Crea tu propia página de enrada con todo lo que te gusta http://live.com
Ruben D. (Guest)
on 2007-06-03 23:55
(Received via mailing list)
Saludos Salvador, lo mas simple que se me ocurre es:

if Animal.valid? and Decomiso.valid? and Donante.valid?
#hacer algo
end

Otra salida podria ser que uses transacciones siempre y cuando tus
objetos de la base de datos lo soporten.

Espero te sirva.
Saludos.
Ruben.
El dom, 03-06-2007 a las 13:16 -0500, salvador zalapa escribió:
Gil G. (Guest)
on 2007-06-04 06:46
(Received via mailing list)
Gracias Ruben, voy a porbar la forma que me propones,

pero a que te refieres con transacciones??


>if Animal.valid? and Decomiso.valid? and Donante.valid?
> > Si estoy de acuerdo Jaime, pero lo que yo deseo es que al momento de
> > SUpongo q debe ser falcil y me estoy complicando la vida pero las
> > >castellano"<removed_email_address@domain.invalid>
> > >campos,
> > >Ror-es mailing list
> > http://lists.simplelogica.net/mailman/listinfo/ror-es
>
>_______________________________________________
>Ror-es mailing list
>removed_email_address@domain.invalid
>http://lists.simplelogica.net/mailman/listinfo/ror-es

_________________________________________________________________
Windows Live Spaces en Prodigy/MSN Spaces: Crea tu propio espacio.
http://spaces.live.com
Luis V. (Guest)
on 2007-06-04 11:28
(Received via mailing list)
Con una transacción, se van haciendo las operaciones en la BBDD y si
salta
alguna excepción, se cancela la ejecución y se hace un rollback en la
BBDD.

Se hace más o menos así


  def tu_metodo
    begin
      Animal.transaction do #---> Aquí no importa el modelo que pongas,
creo
recordar
        @animal = Animal.new(params[:animal])
        @animal.save! #--> ponle la exclamación para que en caso de que
no
se guarde salte excepción
        @decomiso = Decomiso.new(params[:decomiso])
        @decomiso.save!
        @donante = Donante.new(params[:donante])
        @donante.save!
     end
    rescue
      flash[:error]  = $!.to_s # -> para poner el texto de la excepción
en
el flash
    end
  end

No sé si los ends están bien puestos, pero más o menos se ve la esencia.

Y si quieres controlar algo más, para cancelar la ejecución, le metes un
raise "tu excepción" para que salte una excepción

Espero haberte ayudado, un saludo
Damian J. (Guest)
on 2007-06-04 16:37
(Received via mailing list)
On 6/3/07, salvador zalapa <removed_email_address@domain.invalid> wrote:
> Que tal !. la situacion es la siguiente:
> Se pretende crear una aplicacion para dar de alta animales que lleguen a un
> zoologico, cabe destacar que los animales recibidos pueden ser entregado por
> un donante voluntario o pueden haber sido regogidos en algun decomiso, para
> esto pense en los siguientes modelos:

Todo esto que mencionás *son* reglas de negocio, y creo que no
seríacorrecto que estén en el controlador.

Podrías pensar en un modelo de datos Recepción, que es el encargado de
implementar toda esta lógica que decís:

class Recepcion < AR::Base
  belongs_to :animal
  belongs_to :donante
  belongs_to :decomiso

  before_create :hacer_cosas

  protected
  def hacer_cosas
    # Validás cosas, das de alta, etc...
  end
end


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