Ruby on Rails6 Praktischer Leitfaden [Erweiterungen] cp7 ~ cp9 [Memo]

Einführung

Der Autor dieses Artikels ist ein Anfänger, der gerade erst anfängt, Programmieren zu lernen. Ich würde mich freuen, wenn Sie auf Fehler hinweisen könnten.

Überblick

Dieser Artikel ist eine persönliche Notiz von dem, was ich durch Lesen des Ruby on Rails 6 Practical Guide gelernt habe. Es scheint schwer zu lesen zu sein, da es auszugsweise und aufgegriffen ist. Entschuldigung. Dieses Buch hat auch eine Fortsetzung Erweiterung, und beide wurden zum Zeitpunkt des Schreibens des Artikels untersucht. Ich werde auch einen Artikel zur Überprüfung schreiben. Ich werde cp1 und cp2 der Funktionserweiterung überspringen, weil sie die Umgebungskonstruktion und den Code des Hauptteils erklären.

Vorheriger Artikel Ruby on Rails6 - Praktischer Leitfaden cp4 ~ cp6 [Memo] Ruby on Rails6 - Praktischer Leitfaden cp7 ~ cp9 [Memo] Ruby on Rails6 - Praktischer Leitfaden cp10 ~ cp12 [Memo] Ruby on Rails6 - Praktischer Leitfaden cp13 ~ cp15 [Memo] Ruby on Rails6 - Praktischer Leitfaden cp16 ~ cp18 [Memo] Ruby on Rails6 - Praktischer Leitfaden [Erweiterungen] cp3 ~ cp6 [Memo]

Funktionserweiterung Kapitel 7 Komplexe Form

Geben Sie in before_validation eine Methode an

before_validation :set_application_start_time

private def set_application_start_time
#Logik weggelassen
end

before_validation führt die entsprechende Methode aus, wenn ein Symbol als Argument angegeben wird.

Es gab viele interessante Codes, aber ich werde dieses Kapitel überspringen, da es schwierig war, allgemeine Informationen auszuschneiden. Ich würde es gerne noch einmal lesen.

Erweiterungen Kapitel 8 Transaktionen und exklusive Sperren

Es wird als Race Condition </ strong> bezeichnet, dass das Ergebnis mehrerer parallel laufender Prozesse je nach Reihenfolge und Zeitpunkt unerwartete Ergebnisse liefert. Race-Bedingungen in der Datenbankverarbeitung können durch die Verwendung von exklusiven Sperren </ strong> behoben werden.

Der folgende Code wird verarbeitet, um sich für das Programm zu bewerben.

def accept(program)
  ActiveRecord::Base.transaction do
    program.lock!
    if max = program.max_number_of_paticipants
      if program.entries.where(canceled: false).count < max
        program.entries.create!(customer: @customer)
        return :accepted
      else
        return :full
      end
    else
      program.entries.create!(customer: @customer)
      return :accepted
    end
  end
end
  • Code, der die Verarbeitung des Controllers an die Instanzmethode der Serviceobjektklasse überträgt.
  • Return gibt das Symbol an die Steuerung zurück. Auf der Controllerseite wird die Verarbeitung entsprechend dem Rückgabewert verzweigt.

Im obigen Code wird der Prozess verzweigt, je nachdem, ob die maximale Teilnehmerzahl definiert oder die maximale Teilnehmerzahl erreicht ist. Wenn gleichzeitig Anträge mit der maximalen Teilnehmerzahl gestellt werden, besteht die Gefahr, dass die Teilnehmerzahl überschritten wird. Verwenden Sie lock!, Um eine exklusive Sperre für den Tabellendatensatz für dieses Objekt zu erhalten. Eine Transaktion muss gestartet werden, um eine exklusive Sperre zu erhalten. Wenn im Transaktionsblock eine Ausnahme auftritt, wird die gesamte Verarbeitung zurückgesetzt. Sie müssen save! Oder create! Verwenden, um eine Ausnahme auszulösen, wenn das Speichern in der Datenbank fehlschlägt.

Funktionserweiterung Kapitel 9 Formularbestätigungsbildschirm

Implementierung des Bestätigungsbildschirms

Wenn Sie im Bestätigungsbildschirm auf die Schaltfläche Aktualisieren klicken, wird diese in der Datenbank gespeichert. Wenn Sie auf die Schaltfläche Korrektur klicken, kehren Sie zum Eingabeformular zurück.

Aktion bestätigen

# PATCH
def confirm
  @confirm_form = Customer::AccountForm.new(current_customer)
  @customer_form.assign_attributes(params[:form])
  if @customer_form.valid?
     render action: "confirm"
  else
    flash.now.alert = "Es liegt ein Fehler in der Eingabe vor."
    render action: "edit"
  end
end
  • Customer :: AccountForm ist eine Klasse von Formularobjekten. Es wird nur eine Validierung durchgeführt, ohne in der Datenbank zu speichern.

Vorlage zur Bestätigung der Aktion anzeigen

haml:_confirm.html.haml


= form_with model: @customer_form, scope: "form",
    url: :customer_account do |f|
  = f.label :family_name
  .field-value.readonly
    = @customer_form.customer.send(family_name)
  = f.hidden_field :family_name
  = f.submit "aktualisieren"
  = f.submit "Korrektur", name: "correct"
    

Die an den Server gesendeten Informationen sind in hidden_field versteckt.

Aktion aktualisieren

def update
  @confirm_form = Customer::AccountForm.new(current_customer)
  @customer_form.assign_attributes(params[:form])
  if params[:commit]
    if @customer_form.save
       flash.notice = "Kontoinformationen aktualisiert."
       redirect_to :customer_account
    else
      flash.now.alert = "Es liegt ein Fehler in der Eingabe vor."
      render action: "edit"
    end
  else
    render action: "edit"
  end
end

Ob die richtige Taste oder die Update-Taste gedrückt wird, hängt davon ab, ob der Wert "commit" im Parameter eingestellt ist.

  = f.submit "aktualisieren"
  = f.submit "Korrektur", name: "correct"

Sie können der Submit-Methode die Option name geben. Der Standardwert ist Commit. Wenn die Aktualisierungstaste gedrückt wird, wird der Parameter der Taste "Festschreiben" erweitert, und wenn die richtige Taste gedrückt wird, wird der Parameter der Taste "Richtig" auf die Aktualisierungsaktion erweitert.

Fortsetzung

Wir werden die URLs der folgenden Artikel einzeln hinzufügen.

Ruby on Rails6 - Praktischer Leitfaden [Erweiterungen] cp10 ~ cp12 [Memo]

Quelle zitieren

Recommended Posts