2012-01-13 27 views
16

estoy bastante nuevo en los carriles y que ahora se encontró con un problema que yo no era capaz de resolver con mi amigo Google :)Rieles: ¿cómo validar un campo solo si otro campo tiene un cierto valor?

En mi forma tengo a Seleccione con tres valores: de Apple, Banana y Cherry. Si elijo Apple del seleccionar Oculto otro Seleccionar- y un Campo de texto con algo de Javascript, porque cuando se elige Apple, no hay necesidad de rellenar estos otros dos campos más.

Así que ahora tengo un problema con la validación de mi formulario cuando se envía. He encontrado algunos problemas similares, por ejemplo en el caso de "Valide solo un campo si el otro está en blanco".

Este problema se resolvió así:

validates_presence_of :mobile_number, :unless => :home_phone? 

así que he acaba de intentar el primero que me vino a la mente:

validates_presence_of :state, :granted_at, :if => :type != 1 

Pero cuando corro, me sale este error :

undefined method `validate' for true:TrueClass 

Así que ahora no he encontrado cómo puedo acceder a los valores del objeto que fue creado ... gracias de antemano por su ayuda y espero que mi pregunta no es tan obvia como parece :-)

Respuesta

27

Debido a que es un código ejecutable que necesita para envolverlo en una lambda o un objeto Proc así:

validates_presence_of :state, :granted_at, :if => lambda { |o| o.type != 1 } 

# alternatively: 
..., :if => lambda { self.type != 1 } 
..., :if => Proc.new { |o| o.type != 1 } 
..., :if ->(o) { o.type != 1 } 
+0

agradecimiento usted para la respuesta rápida :) pero, ¿qué contiene esta variable de bloque "o"? el objeto que está siendo validado? – TehQuila

+0

Sí, exactamente. También eche un vistazo a la respuesta de @ Hauleth donde puede encontrar otras formas de resolver su problema. La referencia definitiva se puede encontrar en la Documentación de la API de Rails: http://ar.rubyonrails.org/classes/ActiveRecord/Validations/ClassMethods.html esperamos que ayude. Además, sugiero que busques en Google "procs y bloques de ruby" para aprender sobre los bloques de construcción básicos (ruby) detrás de esto. Espero que ayude. – Matt

21

puede utilizar if bandera y lambda:

validates_presence_of :state, :granted_at, :if => lambda {self.type != 1} 

O simplemente crear método privado:

validates_presence_of :state, :granted_at, :if => :valid_type? 

private 
def valid_type? 
    type != 1 
end 
1

aunque las formas antes mencionadas son las mejores prácticas pero también se puede hacer que sea sencillo como esto:

validates_presence_of :state, :granted_at, :if => "type!=1" 
1

Basándose en las respuestas anteriores, también se puede utilizar una más corta "flecha" sintaxis

validates :state, :granted_at, presence: true, if: ->(o) { o.type != 1 } 
Cuestiones relacionadas