Sie wissen, wie myblog.com/posts/donald-e-knuth.
Soll ich mache das mit der eingebauten parameterize
Methode ?
Was ist mit einem Plugin? Ich könnte mir vorstellen, dass ein Plugin nett ist, um doppelte Slugs usw. zu handhaben. Hier sind einige beliebte Github-Plugins - hat jemand Erfahrung mit ihnen?
Im Grunde scheint es so, als wären Schnecken ein völlig gelöstes Problem, und ich möchte das Rad nicht neu erfinden.
Ich benutze folgendes, was wird
def to_slug
#strip the string
ret = self.strip
#blow away apostrophes
ret.gsub! /['`]/,""
# @ --> at, and & --> and
ret.gsub! /\s*@\s*/, " at "
ret.gsub! /\s*&\s*/, " and "
#replace all non alphanumeric, underscore or periods with underscore
ret.gsub! /\s*[^A-Za-z0-9\.\-]\s*/, '_'
#convert double underscores to single
ret.gsub! /_+/,"_"
#strip off leading/trailing underscore
ret.gsub! /\A[_\.]+|[_\.]+\z/,""
ret
end
also zum beispiel:
>> s = "mom & dad @home!"
=> "mom & dad @home!"
>> s.to_slug
> "mom_and_dad_at_home"
In Rails können Sie # parameterize verwenden
Beispielsweise:
> "Foo bar`s".parameterize
=> "foo-bar-s"
Der beste Weg, um Slugs zu generieren, ist die Verwendung von nidecode gem . Es verfügt über die mit Abstand größte verfügbare Transliterationsdatenbank. Es gibt sogar Transliterationen für chinesische Schriftzeichen. Ganz zu schweigen von allen europäischen Sprachen (einschließlich lokaler Dialekte). Es garantiert eine kugelsichere Schneckenkreation.
Betrachten Sie zum Beispiel diese:
"Iñtërnâtiônàlizætiøn".to_slug
=> "internationalizaetion"
>> "中文測試".to_slug
=> "zhong-wen-ce-shi"
Ich benutze es in meiner Version der String.to_slug-Methode in meinem Ruby_extensions-Plugin . Siehe Ruby_extensions.rb für die to_slug-Methode.
Folgendes verwende ich:
class User < ActiveRecord::Base
before_create :make_slug
private
def make_slug
self.slug = self.name.downcase.gsub(/[^a-z1-9]+/, '-').chomp('-')
end
end
Ziemlich selbsterklärend, obwohl das einzige Problem darin besteht, dass es nicht name-01 oder so etwas gibt, wenn es bereits dasselbe gibt.
Beispiel:
".downcase.gsub(/[^a-z1-9]+/, '-').chomp('-')".downcase.gsub(/[^a-z1-9]+/, '-').chomp('-')
Ausgänge: -downcase-gsub-a-z1-9-chomp
Das Hauptproblem für meine Apps waren die Apostrophe - selten möchten Sie, dass die -s alleine da draußen sitzen.
class String
def to_slug
self.gsub(/['`]/, "").parameterize
end
end
Ich habe es ein wenig modifiziert, um Bindestriche anstelle von Unterstrichen zu erzeugen, falls jemand interessiert ist:
def to_slug(param=self.slug)
# strip the string
ret = param.strip
#blow away apostrophes
ret.gsub! /['`]/, ""
# @ --> at, and & --> and
ret.gsub! /\s*@\s*/, " at "
ret.gsub! /\s*&\s*/, " and "
# replace all non alphanumeric, periods with dash
ret.gsub! /\s*[^A-Za-z0-9\.]\s*/, '-'
# replace underscore with dash
ret.gsub! /[-_]{2,}/, '-'
# convert double dashes to single
ret.gsub! /-+/, "-"
# strip off leading/trailing dash
ret.gsub! /\A[-\.]+|[-\.]+\z/, ""
ret
end
Das Unidecoder-Juwel wurde seit 2007 nicht mehr aktualisiert.
Ich empfehle den Stringex-Edelstein, der die Funktionalität des Unidecoder-Edelsteins beinhaltet.
https://github.com/rsl/stringex
Betrachtet man den Quellcode, scheint er den Unidecoder-Quellcode neu zu packen und neue Funktionen hinzuzufügen.
Wir benutzen to_slughttp://github.com/ludo/to_slug/tree/master
. Tut alles, was wir tun müssen (Flucht vor 'funky characters'). Hoffe das hilft.
EDIT: Scheint, meine Verbindung zu brechen, tut mir leid.
Vor kurzem hatte ich das gleiche Dilemma.
Da ich wie Sie das Rad nicht neu erfinden möchte, habe ich mich nach dem Vergleich auf = für friendly_id entschieden Die Ruby Toolbox: Rails Permalinks & Slugs .
Ich habe meine Entscheidung auf folgendes gestützt:
Hoffe, das hilft bei der Entscheidung.
Ich fand das Unidecode-Juwel viel zu schwer und lud fast 200 YAML-Dateien für das, was ich brauchte. Ich wusste, dass iconv
einige Unterstützung für die grundlegenden Übersetzungen hatte, und obwohl es nicht perfekt ist, ist es eingebaut und ziemlich leicht. Das habe ich mir ausgedacht:
require 'iconv' # unless you're in Rails or already have it loaded
def slugify(text)
text.downcase!
text = Iconv.conv('ASCII//TRANSLIT//IGNORE', 'UTF8', text)
# Replace whitespace characters with hyphens, avoiding duplication
text.gsub! /\s+/, '-'
# Remove anything that isn't alphanumeric or a hyphen
text.gsub! /[^a-z0-9-]+/, ''
# Chomp trailing hyphens
text.chomp '-'
end
Natürlich sollten Sie es wahrscheinlich als Instanzmethode für alle Objekte hinzufügen, auf denen Sie es ausführen, aber aus Gründen der Übersichtlichkeit habe ich es nicht getan.
Mit Rails 3 habe ich einen Initialisierer namens slug.rb erstellt, in den ich den folgenden Code eingefügt habe:
class String
def to_slug
ActiveSupport::Inflector.transliterate(self.downcase).gsub(/[^a-zA-Z0-9]+/, '-').gsub(/-{2,}/, '-').gsub(/^-|-$/, '')
end
end
Dann verwende ich es an einer beliebigen Stelle im Code, es ist für eine beliebige Zeichenfolge definiert.
Das Transliterat wandelt Dinge wie é, á, ô in e, a, o um. Da ich eine Website auf Portugiesisch entwickle, ist das wichtig.