J'ai créé un formulaire commun qui passe aux écrans de saisie, de confirmation et d'achèvement, et j'ai essayé les contre-mesures du navigateur avec uuid, alors prenez note. Plutôt que le navigateur en arrière lui-même, le but est d'empêcher l'utilisateur de publier à plusieurs reprises sur l'écran de confirmation de l'achèvement.
Ajoutez une colonne pour stocker uuid dans la table DB. Ensuite, uuid est également sauvegardé au moment de l'écran de fin, mais si l'uuid restant dans le paramètre existe déjà dans la table, il est redirigé vers l'écran d'erreur.
Ajoutez une colonne pour stocker uuid.
20201003xxxxxx_add_uuid_to_sample.rb
class AddUuidToSamples < ActiveRecord::Migration[5.2]
def change
add_column :samples, :uuid, :string
end
end
Tout d'abord, émettez uuid au moment de la nouvelle action. Ensuite, confirmez et créez pour vérifier si uuid dans le formulaire n'existe pas déjà, et s'il existe, passez à l'écran d'erreur.
sample_controller.rb
before_action :verify_validate, only: [:confirm, :create]
def new
@sample_form.uuid = ::SecureRandom.uuid
end
def confirm
end
def create
if sample_form.save
redirect_to complete_sample_path
else
render :error
end
end
private
def sample_form
@sample_form ||= ::SampleForm.new(Sample.new)
end
def verify_validate
render :new sample_form.validate(params[:sample])
return redirect_to error_sample_path if Sample.exists?(uuid: sample_form.uuid)
end
Enfin, mettez hidden_field dans la vue correspondant à new et confirmez. L'uuid est généré uniquement par la nouvelle action, et après cela, le hidden_field est utilisé pour le relais de compartiment.
new.slim
= form_for sample_form, url: confirm_samples_path do |f|
#réduction
= f.hidden_field :uuid
= f.button 'Vérification'
confirm.slim
= form_for sample_form, url: confirm_samples_path do |f|
#réduction
= f.hidden_field :uuid
= f.button 'Envoyer'