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.

246voto

grosser Punkte 14107

In Rails können Sie verwenden #parametrisieren

Zum Beispiel:

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

38voto

klochner Punkte 7949

Ich verwende die folgende Methode, die

  • übersetze & --> "und" und @ --> "bei"
  • fügt keinen Unterstrich anstelle eines Apostrophs ein, also "foo's" --> "foos"
  • enthält keine doppelten 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

so zum Beispiel:

>> s = "mom & dad @home!"
=> "mom & dad @home!"
>> s.to_slug
> "mom_and_dad_at_home"

9voto

Garrett Punkte 7502

Das 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 dabei ist, dass, wenn es bereits denselben gibt, er nicht name-01 oder so ähnlich heißen wird.

Beispiel:

".downcase.gsub(/[^a-z1-9]+/, '-').chomp('-')".downcase.gsub(/[^a-z1-9]+/, '-').chomp('-')

Ausgänge: -downcase-gsub-a-z1-9-chomp

6voto

Victor S Punkte 4970

Ich habe es ein wenig geändert, um Bindestriche anstelle von Unterstrichen zu erzeugen, falls es jemanden interessiert:

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

6voto

Tilo Punkte 32417

Das Unidecoder-Gem ist seit 2007 nicht mehr aktualisiert worden.

Ich würde das stringex-Gem empfehlen, das die Funktionalität des Unidecoder-Gems enthält.

https://github.com/rsl/stringex

Wenn man sich den Quellcode ansieht, scheint er den Unidecoder-Quellcode neu zu verpacken und neue Funktionen hinzuzufügen.

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