Hier ist was ich benutze. Das Token muss nicht unbedingt gehört werden, um es zu erraten. Es ist eher eine kurze URL-Kennung als alles andere, und ich möchte es kurz halten. Ich habe einige Beispiele befolgt, die ich online gefunden habe, und im Falle einer Kollision denke ich, dass der folgende Code das Token neu erstellt, bin mir aber nicht sicher. Ich bin jedoch gespannt auf bessere Vorschläge, da sich dies an den Rändern etwas rau anfühlt.
def self.create_token
random_number = SecureRandom.hex(3)
"1X#{random_number}"
while Tracker.find_by_token("1X#{random_number}") != nil
random_number = SecureRandom.hex(3)
"1X#{random_number}"
end
"1X#{random_number}"
end
Meine Datenbankspalte für das Token ist ein eindeutiger Index, den ich auch validates_uniqueness_of :token
für das Modell verwende. Da diese jedoch in Stapeln automatisch basierend auf den Aktionen eines Benutzers in der App erstellt werden (sie geben eine Bestellung auf und kaufen die Token im Wesentlichen), ist dies der Fall Es ist nicht möglich, dass die App einen Fehler auslöst.
Ich könnte auch die Wahrscheinlichkeit von Kollisionen verringern, am Ende eine weitere Zeichenfolge anhängen, etwas, das basierend auf der Zeit oder ähnlichem generiert wird, aber ich möchte nicht, dass das Token zu lang wird.