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".
+1 gran detalle y opciones. –
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 ... ?? –
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. –