Ich werde darüber schreiben, was zu tun ist, wenn eine bestimmte Validierung nur auf einem bestimmten Controller funktionieren soll.
Überlegen Sie beispielsweise beim Registrieren von Benutzerinformationen, wann Sie Informationen Schritt für Schritt registrieren möchten.
Benutzertabelle
column | type |
---|---|
name | string |
string | |
password | string |
address | string |
image | string |
Seite 1: Name, E-Mail, Passwort 2. Seite: Adresse, Bild
Überlegen Sie, wie Sie den Namen, die E-Mail-Adresse und das Kennwort speichern und anschließend die Adresse und das Bild speichern.
Wenn Sie möchten, dass alle Spalten erforderlich sind, führt das Schreiben von "Präsenz: Wahr" in das Modell zu einem Fehler bei der Registrierung der ersten Seite. (Weil die Adresse und das Bild leer sind)
Was soll ich tun, wenn ich auf der ersten und zweiten Seite unterschiedliche Validierungen verwenden möchte?
Sie können "with_options" für jede Aktion verwenden. Das Bild ist, dass Sie die Validierungsgruppe im Modell als "with_options on: ~ do" benennen und die Validierung mit der Methode "valid? (Name)" auf dem Controller überprüfen.
Die spezifische Schreibmethode ist wie folgt. (Bitte beachten Sie, dass einige Teile mit einer leichten Unterbrechung geschrieben sind.)
Modell-
with_options on: :step1 do
validates :name, presence: true
validates :email, uniqueness: true
validates :password, presence: true, length: { minimum: 8 }
validates :password, confirmation: true
end
with_options on: :step2 do
validates :address, presence: true
validates :image, uniqueness: true
end
step1 controller
def create
@user = User.new(user_params)
if @user.valid?(:step1) && @user.save
return redirect_to step2_path
end
render :new
end
step2 controller
def update
@user = User.find(params[:id])
if @user.valid?(:step2) && @user.update(user_params)
return redirect_to user_path
end
render :edit
end
Wenn Sie alle Validierungen gleichzeitig anwenden möchten, müssen Sie als "gültig? (: Schritt 1) && gültig? (: Schritt 2)" schreiben, was ein wenig mühsam ist ... (Ich dachte, dass alle with_options nur von valid? Verwendet würden, aber es hat nicht funktioniert)
Übrigens, wenn Sie create und update richtig verwenden möchten, lesen Sie bitte den Artikel hier. (Obwohl es einen Teil gibt, der sich mit diesem Beitrag überschneidet ...)
Recommended Posts