Ruby on Rails: Erste Schritte: Validierung

Aus Wikibooks

Das Rails-System generiert unter http://127.0.0.1:3000/activity/new eine Ansicht in der wir neue Aktivitäten hinzufügen können.

Rufen wir die Seite auf und speichern eine Aktivität ohne weitere Eingaben. Nach dem Speichern erhalten wir die Meldung Activity was successfully created und die Liste der Einträge. Wir fügen einen weiteren Eintrag mit der Beschreibung Wunschdenken und dem dem 1. January 2011 als Datum ein.

Wir müssen nicht lange überlegen, um festzustellen, dass diese beide Einträge sinnlos sind. Ein Eintrag ohne Beschreibung und ein Eintrag in der Zukunft haben nichts im System zu suchen.

Um sinnlose Einträge zu vermeiden, müssen wir daher die Eingaben vor dem Speichern überprüfen. Die Bedingungen an Modelldaten werden in Rails mit Validatoren geprüft. Es gibt eine Sammlung von Prüfmethoden, die Standardbedingungen und individuelle Bedingungen überprüfen.

Standardvalidatoren[Bearbeiten]

Mit der ersten Überprüfung wollen wir leere Beschreibungen verhindern. Dies ist eine übliche Bedingung und wir können den Standardvalidator validates_presence_of verwenden. Im acitvity-Modell ergänzen wir den Validator.

# Datei: app/models/activity.rb
class Activity < ActiveRecord::Base

  validates_presence_of :description, :message => 'Bitte geben Sie eine Beschreibung an.'
end

Wie alle Standardvalidatoren besteht der Methodennamen aus validates_ und dem Namen für die eigentliche Bedingung. Im ersten Parameter wird das zu überprüfende Attribut genannt, dem eine Fehlermeldung folgt.

Wenn wir jetzt versuchen unter http://127.0.0.1:3000/activity/new einen Eintrag ohne Beschreibung zu speichern, wird der Eintrag nicht gespeichert und wir erhalten die Fehlermeldung

1 error prohibited this activity from being saved
There were problems with the following fields:
Description Bitte geben Sie eine Beschreibung an.

und das Eingabefeld für die Beschreibung wird rot umrandet.

In Erwartung einer aussagekräftigen Beschreibung fordern wir zusätzlich, dass die Beschreibung mindestens 5 Zeichen umfasst.

# Datei: app/models/activity.rb
class Activity < ActiveRecord::Base
  
  validates_presence_of :description, :message => 'Bitte geben Sie eine Beschreibung an.'
  validates_length_of :description, :minimum => 5, :message => 'Die Beschreibung ist zu kurz.'
end

Der Standardvalidator validates_length_of verwendet zusätzliche Parameter für die Grenzwerte. Im obigen Beispiel geben wir mit minimum die kleinstmögliche Länge an.

Individuelle Validatoren[Bearbeiten]

Um das eingegebene Datum zu überprüfen, helfen uns keine Standardvalidatoren. Wir müssen in einem individuellen Validator überprüfen, ob das Datum in der Vergangenheit liegt.

Der Validator muss als Methode definiert werden.

# Datei: app/models/activity.rb
class Activity < ActiveRecord::Base
  
  validates_presence_of :description, :message => 'Bitte geben Sie eine Beschreibung an.'
  validates_length_of :description, :minimum => 5, :message => 'Die Beschreibung ist zu kurz.'
  
  def validate
    if Date.today < day
      errors.add :day, 'Bitte wählen Sie kein zukünftiges Datum.'
    end
  end
end

Mit if Date.today < day überprüfen wir, ob der angegebene Tag in der Zukunft liegt. Dabei bestimmt Date.today das heutige Datum und day ist der vom Benutzer eingegebene Tag. Liegt das Datum in der Zukunft, fügen wir mit errors.add eine Fehlermeldung ein. Der erste Parameter benennt das Attribut; der zweite Parameter enthält die Fehlermeldung.

Wenn wir nun bei einem Eintrag den 1. January 2008 wählen erhalten wir die Fehlermeldung:

1 error prohibited this activity from being saved
There were problems with the following fields:
Day Bitte wählen Sie kein zukünftiges Datum.