72 Stimmen

Der beste Weg, um Slugs (menschenlesbare IDs) in Rails zu generieren

Sie wissen schon, wie myblog.com/posts/donald-e-knuth.

Sollte ich dies mit dem eingebauten parameterize Methode ?

Wie wäre es mit einem Plugin? Ich könnte mir vorstellen, dass ein Plugin für den Umgang mit doppelten Slugs usw. nützlich ist. Hier sind einige beliebte Github-Plugins - hat jemand Erfahrung mit ihnen?

  1. http://github.com/rsl/stringex/tree/master
  2. http://github.com/norman/friendly_id/tree/master

Im Grunde genommen scheint es, als ob Schnecken ein völlig gelöstes Problem sind, und ich muss das Rad nicht neu erfinden.

6voto

Mark Swardstrom Punkte 16341

Das Hauptproblem bei meinen Anwendungen waren die Apostrophe - selten will man das -s allein stehen haben.

class String

  def to_slug
    self.gsub(/['`]/, "").parameterize
  end

end

3voto

theIV Punkte 24844

Wir verwenden to_slug http://github.com/ludo/to_slug/tree/master . Erfüllt alles, was wir brauchen (Ausblenden von "komischen Zeichen"). Ich hoffe, das hilft.

EDIT: Es scheint, dass mein Link nicht mehr funktioniert, sorry dafür.

3voto

Marius Butuc Punkte 16731

Vor kurzem hatte ich das gleiche Dilemma.

Da ich, wie Sie, das Rad nicht neu erfinden möchte, habe ich mich für friendly_id nach dem Vergleich auf Die Ruby-Werkzeugkiste: Rails Permalinks & Slugs .

Ich habe meine Entscheidung auf diese Weise getroffen:

  • Anzahl der Github-Beobachter
  • Anzahl der Github-Forks
  • Wann wurde die letzte Übertragung vorgenommen?
  • Anzahl der Downloads

Ich hoffe, dies hilft bei der Entscheidungsfindung.

2voto

coreyward Punkte 72986

Ich fand das Unidecode-Gem viel zu schwergewichtig, da es fast 200 YAML-Dateien lud, für das, was ich brauchte. Ich wusste iconv hatte einige Unterstützung für die grundlegenden Übersetzungen, und obwohl es nicht perfekt ist, ist es eingebaut und ziemlich leicht. Dies ist, was ich kam mit:

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 auf alle Objekte, die Sie es auf, aber für Klarheit, habe ich nicht hinzufügen.

0voto

Thiago Ganzarolli Punkte 1131

Mit Rails 3 habe ich einen Initializer, 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 überall im Code, wo ich will, es ist für jeden String definiert.

Das Transliterat wandelt Dinge wie é,á,ô in e,a,o um. Da ich eine Website auf Portugiesisch entwickle, ist das wichtig.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X