[RUBY] Contre-mesures pour la publication continue par le navigateur en utilisant uuid

Aperçu

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.

politique

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.

la mise en oeuvre

1. Ajouter une colonne

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

2. Contrôleur

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

3. Afficher

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'

Recommended Posts

Contre-mesures pour la publication continue par le navigateur en utilisant uuid