Ich verwende "friendly_id", um meine Modelle zu stupsen. Da der Slug eindeutig sein muss, wenn ich die gleichen Daten einchecke, bekomme ich einen langen Hash in der Slug angehängt.
%Vor% Gibt es eine Möglichkeit, friendly_id zu sagen, um besser formatierte Slugs wie explore-1
und explore-2
Version: friendly_id 5.0.4
Einverstanden, es scheint wie ziemlich grob Verhalten.
Wenn Sie sich den Code von friendly_id/slugged.rb
ansehen, gibt es zwei Funktionen, die Konfliktauflösungslogik übergeben:
Also, die Idee ist nur, es zu verpatzen. Ich sehe 2 Optionen:
Fügen Sie einfach resolve_friendly_id_conflict
hinzu, fügen Sie Ihr zufälliges Suffix hinzu.
Ändere die Logik beider Methoden mit der Absicht, alle Kandidaten zu testen, bis slug_generator.generate(candidates)
etwas zurückgibt, das nicht leer ist. Wenn alle Kandidaten nil
geben, dann fallback auf resolve_friendly_id_conflict
method.
Mit dieser Technik können Sie Slug-Kandidaten verwenden, um das id
des Modells anzufügen, wenn der Slug nicht eindeutig ist.
Idealerweise wäre es schön, wenn die Autoren von Gem eine Konfigurationsoption hinzugefügt hätten, um die Auflösung der einzelnen Slags (Methodensymbol oder Proc-Generator und Kandidaten als Parameter) zu handhaben oder einfach zu überprüfen, ob das Modell auf eine Methode reagiert.
Außerdem wird in einigen Anwendungsfällen eine einzigartige Slugs-Auflösung überhaupt nicht benötigt. Zum Beispiel, wenn wir uns nur auf validates_uniqueness_of :slug
oder Eindeutigkeitsvalidierung von Kandidaten verlassen wollen.
Wenn also irgendjemand auf dieses Problem stößt, habe ich ein Update, das ich gerne als Kommentar in Tirdadcs Kommentar eingefügt hätte, aber ich kann nicht (nicht genug Reputation). Also, hier gehts:
Tirdadcs Antwort ist in der Theorie perfekt, aber leider ist die ID eines Objekts noch nicht an dem Punkt zugewiesen, an dem slug_candidates aufgerufen wird, also müssen Sie ein wenig tricksen. Hier ist der vollständige Weg, um einen Slug mit der ID des Objekts zu erhalten:
%Vor%Du setzt also den Slug nach der Erschaffung des Objekts und dann, nachdem das Objekt erstellt wurde, nimmst du den Slug heraus und führst einen Speichervorgang durch, der den Slug neu zuweisen wird (jetzt mit der ID intakt). Ist das Speichern eines Objekts in einem after_create-Aufruf gefährlich? Wahrscheinlich, aber es scheint für mich zu funktionieren.
Ich würde empfehlen, das Modul :scoped
zu verwenden, wenn Sie UUIDs in Ihren Nackteilen vermeiden wollen, wenn Sie mit Kollisionen zu tun haben. Hier ist die Dokumentation zusammen mit einem Beispiel:
Versuchen Sie es mit :scope => :id
, da jede ID sowieso eindeutig ist und sehen Sie, ob das für Sie funktioniert.
UPDATE:
Um genau das zu bekommen, was Sie wollen, haben Sie jetzt candidates
zu diesem Zweck in Version 5:
Heute kam ich über dieses Thema und während andere Antwort mir half, anzufangen, war ich nicht zufrieden, weil, wie Sie, ich wollte, dass die Schnecken in Reihenfolge wie explore
, explore-2
, explore-3
erscheinen.
Also, hier ist, wie ich es behoben habe:
%Vor% Ich habe die Eindeutigkeitsprüfung für :slug
nur dann verwendet, wenn dieses Modell im gleichzeitigen Code verwendet wird.
Hier können Sie sehen, wie es funktioniert:
%Vor% Wenn Sie sqlite3 adapter verwenden, müssen Sie auch sqlite3_ar_regexp
gem installieren (es wird nicht sehr schnell sein, da SQLite kein REGEXP () hat und stattdessen Ruby-Code auswertet).
Tags und Links ruby-on-rails rubygems ruby-on-rails-4 friendly-id