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.
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]
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.
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
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.
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.
# 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
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.
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.
Nous ajouterons les URL des articles suivants un par un.
Ruby on Rails6 Practical Guide [Extensions] cp10 ~ cp12 [Memo]
Recommended Posts