2012-04-18 12 views
5

Tengo un modelo de factura con approver_note, po_number y state_id.Rails 3 Validación con condiciones de alcance

necesito validaciones a comprobar:

validates :approver_note, :presence => true, {:scope => state_id == 3} 
validates :po_number, :presence => true, {:scope => state_id ==2} 

lo tanto, si el usuario selecciona state_id = 3, se debe introducir una nota. Si selecciona state_id = 2, debe ingresar un po_number.

Cualquier ayuda sería genial ... ¡gracias!

Respuesta

7

Está buscando la opción :if en lugar de :scope.

validates :approver_note, :presence => true, 
    :if => lambda { |invoice| invoice.state_id == 3 } 

Pero desde un lambda es un poco feo, probablemente añadir un método para encapsular lo que está haciendo un poco mejor:

validates :approver_note, :presence => true, :if => :requires_note? 
validates :po_number, :presence => true, :if => requires_po_number? 

def requires_note? 
    state_id == 3 
end 

def requires_po_number? 
    state_id == 2 
end 

Si realmente tiene un montón de diferentes atributos que se requiere cuando state_id es 3, no sólo una nota, entonces es posible que desee algo como esto:

validates :approver_note, :presence => true, :if => :green_state? 
validates :po_number, :presence => true, :if => orange_state? 

def green_state? 
    state_id == 3 
end 

def orange_state? 
    state_id == 2 
end 

(sustituir "verde" con - no lo sé - "high_documentation" o lo que sea tiene sentido en su mundo)

O tal vez desea que el estado decida lo que es:.

def green_state? 
    state.green? 
end 

realmente ayuda a hacer que la terminología en su adhieren código más de cerca a su mundo real idioma, a diferencia de "3" y "2".

+0

+1 gran detalle y opciones. –

+0

Perfecto, gracias! Usé tu segunda opción, ya que tampoco me gustan las lambdas. Sin embargo, aunque obtengo los mensajes de error de validación correctos, el registro aún se actualiza. En otras palabras, cuando el usuario selecciona Aprobar (state_id = 2), sin ingresar un po_number, aparece un error, pero el registro aún se actualiza a invoice.state_id = 2 ... ?? –

+0

Hmm, eso suena como un problema aparte, probablemente en su controlador. Si la validación falla, un ActiveRecord no se guardará. Es posible que desee publicar eso como otra pregunta e incluir su acción de controlador. –

Cuestiones relacionadas