2012-04-09 19 views
12

Esto es lo que esperaba que fuera una pregunta perfectamente directa, pero no puedo encontrar una respuesta definitiva en las Guías ni en ninguna otra parte.Rails 3 Validación: presence => false

Tengo dos atributos en un ActiveRecord. Quiero exactamente uno para estar presente y el otro para ser nil o una secuencia en blanco.

¿Cómo hago el equivalente a: presence => false? Quiero asegurarme de que el valor sea nulo.

validates :first_attribute, :presence => true, :if => "second_attribute.blank?" 
validates :second_attribute, :presence => true, :if => "first_attribute.blank?" 
# The two lines below fail because 'false' is an invalid option 
validates :first_attribute, :presence => false, :if => "!second_attribute.blank?" 
validates :second_attribute, :presence => false, :if => "!first_attribute.blank?" 

O quizás hay una manera más elegante de hacer esto ...

estoy carriles de rodadura 3.0.9

+0

No estoy seguro de lo que necesita el: presencia => false en absoluto en las dos últimas líneas de código . – creativetechnologist

+0

@creativetechnologist Necesita una prueba de algún tipo. Si me deshago de la validación de presencia, me da: C: /Ruby192/lib/ruby/gems/1.9.1/gems/activemodel-3. 0.9/lib/active_model/validations/validates.rb: 79: en 'validates ': Debe proporcionar al menos una validación (ArgumentError) – LikeMaBell

+6

. Vale la pena señalar para Rails 4 que esto se llama' validates_absence_of'. – mpowered

Respuesta

8
class NoPresenceValidator < ActiveModel::EachValidator                                       
    def validate_each(record, attribute, value)         
    record.errors[attribute] << (options[:message] || 'must be blank') unless record.send(attribute).blank? 
    end                   
end  

validates :first_attribute, :presence => true, :if => "second_attribute.blank?" 
validates :second_attribute, :presence => true, :if => "first_attribute.blank?" 

validates :first_attribute, :no_presence => true, :if => "!second_attribute.blank?" 
validates :second_attribute, :no_presence => true, :if => "!first_attribute.blank?" 
0

Probar:

validates :first_attribute, :presence => {:if => second_attribute.blank?} 
validates :second_attribute, :presence => {:if => (first_attribute.blank? && second_attribute.blank?)} 

la esperanza de que ayude.

1

Parece que: length => {: is => 0} funciona para lo que necesito.

validates :first_attribute, :length => {:is => 0 }, :unless => "second_attribute.blank?" 
+1

Esto tiene el mensaje de error "es la longitud incorrecta (debe ser 0 caracteres)". Puede agregar un mensaje personalizado "debe estar en blanco". 'valida: first_attribute,: length => {: is => 0,: message =>" debe estar en blanco "},: unless =>" second_attribute.blank? "' – tfentonz

3

usa la validación personalizada.

validate :validate_method 

# validate if which one required other should be blank 
def validate_method 
    errors.add(:field, :blank) if condition 
end 
23

por permitir que un objeto sea válida si y sólo si un atributo específico es nula, se puede utilizar la "inclusión" en lugar de crear su propio método.

validates :name, inclusion: { in: [nil] } 

Esto es para Rails 3. Los carriles 4 solución es mucho más elegante:

validates :name, absence: true 
Cuestiones relacionadas