[Ruby / Rails] Legen Sie einen eindeutigen (eindeutigen) Wert in der Klasse fest

Für Rubocop wird Loop + Break empfohlen.

Loop + Break-Version

class Nonce
  def set_nonce
    return true if nonce.present? #Schutz vor Überschreiben

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

während Version

class Nonce
  def set_nonce
    return true if nonce.present? #Schutz vor Überschreiben

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

before_create or before_validation

Wenn Sie "validates" wie folgt schreiben, müssen Sie "before_validation" verwenden, da die Verwendung von "before_create" bei der Validierung hängen bleibt.

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

Testbeispiel

# 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] Legen Sie einen eindeutigen (eindeutigen) Wert in der Klasse fest
Ich habe versucht, ein übergeordnetes Wertklasseobjekt in Ruby zu erstellen
[Bestellmethode] Legen Sie die Reihenfolge der Daten in Rails fest
Empfehlung der Serviceklasse in Ruby on Rails
(Ruby on Rails6) Erstellen von Daten in einer Tabelle
Ich möchte den Wert in Ruby erhalten
So erstellen Sie eine eindeutige Datenkombination in der Schienen-Zwischentabelle
So stellen Sie die Anzeigezeit in Rails auf japanische Zeit ein
Berechnen Sie die Differenz zwischen Zahlen in einem Ruby-Array
[Rails 6] So legen Sie ein Hintergrundbild in Rails [CSS] fest
Schreiben Sie die Klassenvererbung in Ruby
Multiplikation innerhalb eines Ruby-Arrays
Schwierigkeiten beim Erstellen einer Ruby on Rails-Umgebung (Windows 10) (SQLite3)
[Ruby on Rails] Zeigt den Seitentitel schnell im Browser an
So rufen Sie den Hashwert in einem Array in Ruby ab
Ein Hinweis zum Seed-Feature von Ruby on Rails
So zeigen Sie Diagramme in Ruby on Rails an (LazyHighChart)
Zuordnung zu einer Klasse mit einem Wertobjekt in How to My Batis
Wenden Sie CSS auf eine bestimmte Ansicht in Ruby on Rails an
Fügen Sie eine Suchfunktion in Rails hinzu.
Über das Symbol <%%> in Rails erb
[Ruby] Beziehung zwischen Elternklasse und Kinderklasse. Beziehung zwischen Klasse und Instanz.
Erstellen Sie eine neue App mit Rails
Ruby on Rails Japanisch-Englisch kompatibler i18n
Implementieren Sie den gRPC-Client in Ruby
(Ruby on Rails6) Erstellen einer Datenbank und Anzeigen in einer Ansicht
Ein Murmeln über die Utility-Klasse
Implementieren Sie ein Kontaktformular in Rails
Ich habe den Ablauf bis zur Implementierung von simple_calendar in Ruby on Rails zusammengefasst.
Dinge, an die Sie sich erinnern sollten, und Konzepte im Ruby on Rails-Tutorial
Ich möchte den Wert von Attribute in Selenium of Ruby ändern
Ruby-Methoden, die häufig in Rails verwendet werden
(Ruby on Rails6) Erstellen Sie eine Funktion zum Bearbeiten des veröffentlichten Inhalts
Wechseln Sie in einem neuen Ruby on Rails-Projekt von SQLite3 zu PostgreSQL
So erstellen Sie eine Abfrage mithilfe von Variablen in GraphQL [Verwenden von Ruby on Rails]
Die Parameter, die ich in Rails erhalten habe, waren etwas anders als ich erwartet hatte
Beispielprogramm, das den Hashwert einer Datei in Java zurückgibt
So ändern Sie den Wert einer Variablen an einem Haltepunkt in IntelliJ
So debuggen Sie die Verarbeitung im Ruby on Rails-Modell nur mit der Konsole
Cloud-IDE: Heroku konnte nicht im Ruby on Rails-Tutorial installiert werden
[Ruby] Gibt Zeichen in Pyramidenform entsprechend der eingegebenen Nummer zurück
[Ruby / Rails] Verwenden Sie einen Alias. Auf eine Weise, dass Rubocop nicht böse wird!
Eine Reihe von Ablauf der Tabellenerstellung → Datensatzerstellung, Löschung → Tabellenlöschung in Ruby on Rails
Richten Sie eine Java-GUI in einem separaten Thread ein, um die Haupt-GUI beizubehalten
[Java] Implementieren Sie eine Funktion, die eine im Builder-Muster implementierte Klasse verwendet
Was ist eine Klasse in der Java-Sprache (3 /?)
Ich habe ein Kalenderproblem mit Ruby versucht
Überprüfen Sie die Notizen für die Klasse java.util.Scanner