Attribute Accessor falla en la vista


#1

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.


#2

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/browse_thread/thread/e86cc71d8e8f6a31?hl=en


#3

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.


#4

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’ %>

class Producto < ActiveRecord::Base

alias_attribute :my_cospro, :cospro

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

end

Saludos

Jaime Mora R.


#5

Damian J. wrote:

Fresquí³©mo tu problema…

http://groups.google.com/group/rubyonrails-core/browse_thread/thread/e86cc71d8e8f6a31?hl=en

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

  1. Utilizar atributos virtuales.

Saludos.

Jaime Mora R.


#6

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


#7

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…


#8

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).


#9

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


#10

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ó:


#11

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


#12

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


#13

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!