Ruby on Rails6 Guide pratique [Extensions] cp7 ~ cp9 [Mémo]

introduction

L'auteur de cet article est un débutant qui commence à peine à apprendre la programmation. Je vous serais reconnaissant si vous pouviez signaler des erreurs.

Aperçu

Cet article est un mémo personnel de ce que j'ai appris en lisant le Guide pratique de Ruby on Rails 6. Il semble difficile à lire car il est extrait et repris. Excusez-moi. Ce livre a également une suite Extension, et les deux ont été étudiés au stade de la rédaction de l'article. J'écrirai également un article pour examen. Je vais sauter cp1 et cp2 de l'extension de fonction car ils expliquent la construction de l'environnement et le code de la partie principale.

Article précédent Guide pratique Ruby on Rails6 cp4 ~ cp6 [Memo] Guide pratique Ruby on Rails6 cp7 ~ cp9 [Memo] Guide pratique Ruby on Rails6 cp10 ~ cp12 [Memo] Guide pratique Ruby on Rails6 cp13 ~ cp15 [Memo] Guide pratique Ruby on Rails6 cp16 ~ cp18 [Memo] Ruby on Rails6 Practical Guide [Extensions] cp3 ~ cp6 [Memo]

Extension des fonctions Chapitre 7 Forme complexe

Spécifiez une méthode dans before_validation

before_validation :set_application_start_time

private def set_application_start_time
#Logique omise
end

before_validation exécute la méthode correspondante lorsqu'un symbole est donné en argument.

Il y avait beaucoup de code intéressant, mais il était difficile de supprimer les informations générales, donc je vais omettre ce chapitre. J'aimerais le relire.

Extensions Chapitre 8 Transactions et verrous exclusifs

On appelle condition de concurrence </ strong> que le résultat de plusieurs processus exécutés en parallèle apporte des résultats inattendus en fonction de l'ordre et du moment. Les conditions de concurrence dans le traitement de la base de données peuvent être résolues en utilisant à bon escient les verrous exclusifs </ strong>.

Le code ci-dessous est en cours de traitement pour postuler au programme.

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 qui transfère le traitement du contrôleur à la méthode d'instance de la classe d'objets de service.
  • Return renvoie le symbole au contrôleur. Du côté du contrôleur, le traitement est ramifié en fonction de la valeur de retour.

Dans le code ci-dessus, le processus est branché selon que le nombre maximum de participants est défini ou que le nombre maximum de participants est atteint. Si les candidatures sont faites en même temps avec le nombre maximum de participants, il y a un risque que le nombre de participants soit dépassé. Utilisez lock! Pour obtenir un verrou exclusif sur l'enregistrement de table pour cet objet. Une transaction doit être lancée pour acquérir un verrou exclusif. Si une exception se produit dans le bloc de transaction, tout le traitement est annulé. Vous devez utiliser save! Or create! Pour lever une exception si l'enregistrement dans la base de données échoue.

Extension des fonctions Chapitre 9 Écran de confirmation de formulaire

Implémentation de l'écran de confirmation

Si vous cliquez sur le bouton de mise à jour sur l'écran de confirmation, il sera enregistré dans la base de données, et si vous cliquez sur le bouton de correction, vous reviendrez au formulaire de saisie.

confirmer l'action

# 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 = "Il y a une erreur dans l'entrée."
    render action: "edit"
  end
end
  • Customer :: AccountForm est une classe d'objets de formulaire. Seule la validation est effectuée sans enregistrement dans la base de données.

Afficher le modèle pour confirmer l'action

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 "mise à jour"
  = f.submit "correction", name: "correct"
    

Les informations envoyées au serveur sont masquées dans hidden_field.

action de mise à jour

def update
  @confirm_form = Customer::AccountForm.new(current_customer)
  @customer_form.assign_attributes(params[:form])
  if params[:commit]
    if @customer_form.save
       flash.notice = "Informations de compte mises à jour."
       redirect_to :customer_account
    else
      flash.now.alert = "Il y a une erreur dans l'entrée."
      render action: "edit"
    end
  else
    render action: "edit"
  end
end

Le fait que le bouton correct ou le bouton de mise à jour soit enfoncé est déterminé par le fait que la valeur «commit» est définie dans le paramètre.

  = f.submit "mise à jour"
  = f.submit "correction", name: "correct"

Vous pouvez donner à la méthode d'envoi l'option de nom. La valeur par défaut est commit. Lorsque le bouton de mise à jour est enfoncé, le paramètre de la touche «commit» est étendu, et lorsque le bouton correct est enfoncé, le paramètre de la touche «correct» est étendu à l'action de mise à jour.

A continué

Nous ajouterons les URL des articles suivants un par un.

Ruby on Rails6 Practical Guide [Extensions] cp10 ~ cp12 [Memo]

Source du devis

Recommended Posts