2012-09-12 7 views
15

En un ActiveRecord (o ActiveModel) Me gustaría recibir la especificación siguiente para pasarRails 3: ¿Cómo valido para permitir espacios en blanco (""), pero no nulo (NULL en la base de datos)

it { should allow_value("").for(:my_string) } 
it { should_not allow_value(nil).for(:my_string) } 

He tratado

validates :my_string, { 
    :length => { :in => 0..255 }, 
    :presence => true, 
    :allow_blank => true, 
    :allow_nil => false, 
} 

y también

validates :my_string, { 
    :length => { :in => 0..255 }, 
    :allow_blank => true, 
    :allow_nil => false, 
} 

Pero ya sea que permite tanto "" y nula o ninguno de ellos.

Respuesta

6

Es posible que tenga que hacer una validación personalizada para esto:

validates :my_string, :length => { :in => 0..255 } 
validate :my_string_is_valid 

def my_string_is_valid 
    self.errors.add :base, 'My string can not be nil' if self.my_string.nil? 
end 
+2

Esto es lo que he hecho ... Sin embargo, me parece extraño que Rails no sea compatible con esta situación. – Jarl

1

O tal vez:

validates :my_string, :length => { :in => 0..255 }, :allow_nil => false 

Parece que allow_nil no anulan allow_blank. Así que es mejor no especificar allow_blank

+0

probando su sugerencia, hace que 'it {should_not allow_value (nil) .for (: my_string)}' falle. – Jarl

+1

cuando tienes 'presence: true, allow_blank: true, allow_nil: false' al mismo tiempo. Permitirá nil –

30

Esto funciona para mí

validates :my_string, length: { in: 0..255, allow_nil: false } 

Si lo que desea es validar que el campo no es nulo, pero no se preocupan por las cadenas en blanco/vacío, esto funciona:

validates :my_string, length: { minimum: 0, allow_nil: false, message: "can't be nil" } 
1

puede crear un validador personalizado simple (colocado en app/validators dir)

class NotNilValidator < ActiveModel::EachValidator 
    def validate_each(record, attribute, value) 
    record.errors[attribute] << "must not be nil" if value.nil? 
    end 
end 

y luego

validates :my_string, not_nil: true 
+0

Esto también se puede escribir como 'record.errors.add (attribute, 'must not nil) if value.nil?' –

1

Usted puede intentar hacer:

validates :my_string, exclusion: { in: [nil]} 

Es parte de las validaciones mismos en ActiveRecord.

He intentado con los demás y todos ellos son muy compatibles o permiten nulo también.

Cuestiones relacionadas