[Ruby / Rails] Définissez une valeur unique (unique) dans la classe

Pour le rubocop, une boucle + une rupture est recommandée.

version boucle + rupture

class Nonce
  def set_nonce
    return true if nonce.present? #Garde pour éviter l'écrasement

    self.nonace = loop do
      random_str = SecureRandom.urlsafe_base64
      break random_str unless self.class.exists?(nonce: random_str)
    end
  end
end

tandis que la version

class Nonce
  def set_nonce
    return true if nonce.present? #Garde pour éviter l'écrasement

    begin
      self.nonce = SecureRandom.urlsafe_base64
    end while self.class.exists?(nonce: nonce)
  end
end

before_create or before_validation

Si vous écrivez validates comme ceci, vous devez utiliser before_validation car vous serez bloqué dans la validation si vous utilisez before_create.

class SomeClass
  validates :nonce, presence: true, uniqueness: true

  before_validation :set_nonce

  private

  def set_nonce
    return true if nonce.present?

    self.nonace = loop do
      random_str = SecureRandom.urlsafe_base64
      break random_str unless self.class.exists?(nonce: random_str)
    end
  end
end

Exemple de test

# frozen_string_literal: true

require 'rails_helper'

describe Nonce, type: :model do
  describe '#set_nonce' do
    it do
      nonce = Nonce.create!
      expect(nonce.nonce.size).to eq(8)
    end

    it do
      nonce = Nonce.new
      expect(nonce.nonce).to be_nil
      nonce.save!
      expect(nonce.nonce.size).to eq(8)
    end

    it do
      nonce = Nonce.create!
      nonce_str = nonce.nonce
      nonce.update!(updated_at: Time.current)
      expect(nonce.nonce).to eq(nonce_str)
    end
  end
end

Recommended Posts

[Ruby / Rails] Définissez une valeur unique (unique) dans la classe
J'ai essayé de créer une classe parent d'objet de valeur dans Ruby
[Order method] Définit l'ordre des données dans Rails
Recommandation de classe de service dans Ruby on Rails
(Ruby on Rails6) Création de données dans une table
Je veux obtenir la valeur en Ruby
Comment créer une combinaison unique de données dans la table intermédiaire des rails
Comment régler l'heure d'affichage sur l'heure japonaise dans les rails
Calculer la différence entre les nombres dans un tableau Ruby
[Rails 6] Comment définir une image d'arrière-plan dans Rails [CSS]
Écrire l'héritage de classe dans Ruby
Multiplication dans un tableau Ruby
Difficultés à créer un environnement Ruby on Rails (Windows 10) (SQLite3)
[Ruby on Rails] Afficher rapidement le titre de la page dans le navigateur
Comment récupérer la valeur de hachage dans un tableau dans Ruby
Une note sur la fonction de départ de Ruby on Rails
Comment afficher des graphiques dans Ruby on Rails (LazyHighChart)
Mappage à une classe avec un objet de valeur dans How to My Batis
Appliquer le CSS à une vue spécifique dans Ruby on Rails
Ajoutez une fonction de recherche dans Rails.
À propos du symbole <%%> dans Rails erb
[Ruby] Relation entre la classe parent et la classe enfant. Relation entre classe et instance.
Créer une nouvelle application avec Rails
Ruby on Rails compatible japonais-anglais i18n
Implémenter le client gRPC dans Ruby
(Ruby on Rails6) Créer une base de données et l'afficher dans une vue
Un murmure sur la classe utilitaire
Implémenter un formulaire de contact dans Rails
J'ai résumé le flux jusqu'à l'implémentation de simple_calendar dans Ruby on Rails.
Points à retenir et concepts dans le didacticiel Ruby on Rails
Je veux changer la valeur de l'attribut dans Selenium of Ruby
Méthodes Ruby souvent utilisées dans Rails
(Ruby on Rails6) Créer une fonction pour modifier le contenu publié
Passer de SQLite3 à PostgreSQL dans un nouveau projet Ruby on Rails
Comment créer une requête à l'aide de variables dans GraphQL [Utilisation de Ruby on Rails]
Les paramètres que j'ai reçus dans Rails étaient un peu différents de ce à quoi je m'attendais
Exemple de programme qui renvoie la valeur de hachage d'un fichier en Java
Comment changer la valeur d'une variable à un point d'arrêt dans intelliJ
Comment déboguer le traitement dans le modèle Ruby on Rails avec juste la console
Cloud IDE: Heroku n'a pas pu être installé dans le didacticiel Ruby on Rails
[Ruby] Renvoie les caractères en forme de pyramide en fonction du nombre saisi
[Ruby / Rails] Utilisez un alias. De manière à ce que rubocop ne se fâche pas!
Une série de flux de création de table → création, suppression d'enregistrement → suppression de table dans Ruby on Rails
Configurez une interface graphique Java dans un thread séparé pour conserver le
[Java] Implémenter une fonction qui utilise une classe implémentée dans le modèle Builder
Qu'est-ce qu'une classe en langage Java (3 /?)
J'ai essayé un problème de calendrier avec Ruby
Consulter les notes de la classe java.util.Scanner