2010-12-23 10 views
5

básicamente tengo un modelo de usuario que tiene un campo de cantidad y dinero. Cuando creo el usuario por primera vez, valido ese user.amount <= user.money. Sin embargo, el usuario puede cambiar la cantidad a través de 'editar'. En la acción de actualización, cuando el usuario cambia la cantidad, calculo la diferencia entre la vieja y la nueva (edad menos nuevo) asciende a través derails validación personalizada después de editar el valor de un campo

amount_change = user.amount - params[:user][:amount].to_f 

No sé si esto es la buena forma pero funciona para mí . Básicamente, no estoy almacenando la diferencia y calculando solo cuando el usuario está tratando de cambiar la cantidad. De todos modos, cuando el usuario edita, me gustaría validar que amount_change <= user.money en su lugar. ¿Cómo puedo hacer esto? Siento que debería pasar algo a la validación, pero no sé cómo puedo pasar en amount_change ya que se calcula en el medio del método de actualización de mi controlador de usuario. ¡Muchas gracias!

Respuesta

11

Puede utilizar ActiveModel::Dirty para acceder al valor antiguo (como amount_was):

class User < ActiveRecord::Base 
    # ... 
    validate :ensure_amount_change_less_than_money, 
      :on => :update, 
      :if => :amount_changed? 

    def ensure_amount_change_less_than_money 
    if (self.amount - self.amount_was) <= self.money 
     errors.add(:money, 'Amount change must be less than money') 
    end 
    end 
end 
+0

esto parece tipo de trabajo - hay un error en el primer intento si no pasa la validación, pero si el usuario simplemente hace clic en enviar de nuevo, no hay ningún error ... ¿esto se debe a que se estableció un nuevo amount_was y amount? ¡Gracias! (¿También está _changed built in?) – butterywombat

+0

Puedes intentar eliminar ': on =>: update' y ver si eso funciona mejor para ti. '_changed' está integrado en ActiveModel y ActiveRecord. – bowsersenior

+0

hmm Por alguna razón, no puedo hacer que el _change funcione,/obtengo un NoMethodError. ¿Importa que mi variable de cantidad real se llame 'start_amount'? Hice 'start_amount_changed?'. ¡Gracias! – butterywombat

Cuestiones relacionadas