2012-09-12 3 views
15

In einer Activerecord (oder ActiveModel) zu erlauben, würde ich die folgende specRails 3: Wie kann ich bestätigen Leerzeichen („“), aber nicht null (NULL in der Datenbank)

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

ich versucht habe, weitergeben möchten

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

und auch

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

Aber entweder es erlaubt "" und keine oder keine von ihnen.

Antwort

6

Möglicherweise müssen Sie eine benutzerdefinierte Validierung für dies tun:

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

Dies ist, was ich getan habe ... Allerdings finde ich es seltsam, dass Rails diese Situation nicht unterstützt. – Jarl

1

Oder vielleicht:

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

Es scheint, dass allow_nil nicht allow_blank außer Kraft setzen. Also besser nicht angeben allow_blank

+0

Wenn Sie Ihren Vorschlag ausprobieren, wird 'it {sollte nicht zulässig sein (nil) .for (: my_string)}}' fail. – Jarl

+1

wenn Sie 'present: true, allow_blank: true, allow_nil: false' gleichzeitig haben. Es erlaubt Null –

30

Dies funktioniert für mich

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

Wenn Sie wollen einfach nur bestätigen, dass das Feld nicht null ist, sondern kümmern sich nicht um leere/leere Strings, das funktioniert:

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

Sie können einen einfachen benutzerdefinierten Validator erstellen (platziert in 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 

und dann

validates :my_string, not_nil: true 
+0

Dies kann auch geschrieben werden als 'record.errors.add (Attribut, 'muss nicht NULL sein) wenn value.nil?' –

1

können Sie tun versuchen:

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

Es war Teil der Validierungen sich in Active ist.

Ich habe die anderen ausprobiert und alle sind sehr compliated oder erlauben auch keine.

Verwandte Themen