2017-02-27 3 views
0

Ich erstelle eine Rails 5-Teamverwaltungs-App, mit der Benutzer Organisationen und Benutzer verwalten können. Ich möchte in der Lage sein, von der Verwendung der ID im Pfad (z. B. /organizations/43) zu wechseln und stattdessen einen alphanumerischen Block zu verwenden (z. B. /organizations/H6Y47Nr7). Ähnlich wie bei Trello (d. H. https://trello.com/b/M9X71pE6/board-name). Gibt es eine einfache Möglichkeit, dies zu tun?Verwenden von alphanumerischen Slugs anstelle von IDs in Routen - Rails

Ich habe den Edelstein FriendlyId gesehen, der sich um den Schlag im Weg kümmern könnte, aber was wäre der beste Weg, den Schlag zu erzeugen?

Idealerweise für die meisten bang for buck der Slug würde AZ, az und 0-9 (wie ich es verstehe, das ist Base58?) Und um die URL nicht zu viel blasen, 8 Charaktere höchstens. Wenn meine Berechnungen korrekt sind, ergibt dies 218 Billionen Kombinationen, die reichlich sein sollten.

Bin ich auf dem richtigen Weg? Jede Hilfe würde sehr geschätzt werden.

Dank

+0

Sie können prüfen, [hashids] (https://github.com/peterhellberg/hashids. rb) Juwel, die Anpassung der Anzahl der Zeichen und Zeichen in Slug enthalten unterstützen. Ich habe vor kurzem ein Rails [plugin] (https://github.com/sajan45/hashids_activarecord) dafür gemacht, aber ich habe noch keines von beiden in der Produktion benutzt. – Sajan

+1

Werfen Sie einen Blick auf meine alte Antwort hier http://stackoverflow.com/a/16096646/1297435 –

Antwort

1

eine Schnecke zu erstellen, ist am einfachsten Weg SecureRandom zu verwenden. Sie können so etwas wie die folgenden in Ihrem Modell

before_create :generate_slug 

private 

def generate_slug 
    begin 
    self.slug = SecureRandom.urlsafe_base64(8) 
    end while Organization.exists?(slug: slug) 
end 

Einen kleinen Nachteil hier mit Bezug auf hinzufügen, was Sie wollen, ist, dass die Schnecke manchmal einen Unterstrich oder einen Bindestrich enthalten, aber das sollte in Ordnung sein.

irb(main):014:0> SecureRandom.urlsafe_base64(8) 
=> "HlHHV_6rN3k" 
irb(main):015:0> SecureRandom.urlsafe_base64(8) 
=> "naRqT-NmYDU" 
irb(main):016:0> SecureRandom.urlsafe_base64(8) 
=> "9h04l4jEEsM" 
+0

Vielen Dank für Ihre Antwort. Kann ich nicht einfach 'SecureRandom.base58 (8)' verwenden? Es gibt etwas wie "KBz4i9ux" zurück. – slehmann36

+0

Und was ist mit Kollisionen? Oder kümmert sich 'SecureRandom'? Danke noch einmal! – slehmann36

+0

nicht vertraut mit 'base58'. Der Grund, warum ich 'urlsafe_base64 'verwendet habe, ist, dass Sie eine URL-sichere Zeichenfolge benötigen. Was Kollisionen betrifft, gibt es eine sehr geringe Chance, dass ein Race Condition passiert, aber ich würde mich nicht darum kümmern – jvnill

0

Wenn Sie diesen Weg gehen, würde ich eine Tabelle erstellen, wurden Sie die Schnecken speichern, die Sie generieren und lösche sie nicht einmal, wenn Sie eine Organisation löschen. Wenn Sie eine neue Organisation erstellen, fragen Sie dieses Modell ab, um sicherzustellen, dass keine Duplikats-Slugs vorhanden sind. Fügen Sie außerdem einen eindeutigen Index in der Slug-Spalte der Organisationstabelle hinzu.

Sie sollten nicht die id-Spalte mit ganzen Zahlen so in der Show-Methode aufgeben werden Sie tun müssen:

org = Organization.where(slug: params[:id]).first 
Verwandte Themen