web-dev-qa-db-de.com

Der beste Weg, um Slugs (lesbare IDs) in Rails

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?

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

Im Grunde scheint es so, als wären Schnecken ein völlig gelöstes Problem, und ich möchte das Rad nicht neu erfinden.

61
Tom Lehman

Ich benutze folgendes, was wird

  • übersetzen & -> "und" und @ -> "um"
  • fügt keinen Unterstrich anstelle eines Apostrophs ein, also "foo's" -> "foos"
  • ohne doppelte Unterstriche
  • erstellt keinen Slug, der mit einem Unterstrich beginnt oder endet

  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"
36
klochner

In Rails können Sie # parameterize verwenden

Beispielsweise:

> "Foo bar`s".parameterize 
=> "foo-bar-s"
213
grosser

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.

51

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

9
Garrett

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
6
Mark Swardstrom

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
6
Victor S

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.

4
Tilo

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.

3
theIV

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:

  • anzahl der Github-Beobachter
  • nein. von Github Gabeln
  • wann wurde das letzte Commit gemacht?
  • nein. von Downloads

Hoffe, das hilft bei der Entscheidung.

3
Marius Butuc

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.

2
coreyward

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.

0