63 votes

Meilleur moyen de générer des slugs (identifiants lisibles par l'homme) dans Rails

Tu sais, comme myblog.com/posts/donald-e-knuth.

Devrais-je faire cela avec la fonction intégrée parameterize méthode ?

Pourquoi pas un plugin ? J'imagine qu'un plugin pourrait être utile pour gérer les limaces en double, etc. Voici quelques plugins Github populaires - quelqu'un a-t-il de l'expérience avec eux ?

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

En gros, il semble que les limaces soient un problème totalement résolu, et je ne veux pas réinventer la roue.

218voto

grosser Points 4300

Dans Rails, vous pouvez utiliser #paramètre

Par exemple :

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

51voto

Paweł Gościcki Points 2679

La meilleure façon de générer des limaces est d'utiliser la fonction Gemme Unidecode . Il possède de loin la plus grande base de données de translittération disponible. Il possède même des translittérations pour les caractères chinois. Sans oublier qu'elle couvre toutes les langues européennes (y compris les dialectes locaux). Il garantit une création de limaces à toute épreuve.

Par exemple, considérez ceux :

"Iñtërnâtiônàlizætiøn".to_slug
=> "internationalizaetion"

>> "中文測試".to_slug
=> "zhong-wen-ce-shi"

Je l'utilise dans ma version de la méthode String.to_slug dans mon plugin ruby_extensions . Voir ruby_extensions.rb pour la méthode to_slug.

36voto

klochner Points 5595

J'utilise ce qui suit, qui va

  • traduisez & --> "and" et @ --> "at".
  • n'insère pas un trait de soulignement à la place d'une apostrophe, donc "foo's" --> "foos".
  • n'inclut pas les double-décalages
  • ne crée pas de slug qui commence ou se termine par un trait de soulignement

    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

donc, par exemple :

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

9voto

Garrett Points 4295

Voici ce que j'utilise :

class User < ActiveRecord::Base
  before_create :make_slug
  private

  def make_slug
    self.slug = self.name.downcase.gsub(/[^a-z1-9]+/, '-').chomp('-')
  end
end

C'est assez explicite, bien que le seul problème soit que s'il y a déjà le même, ce ne sera pas le nom-01 ou quelque chose comme ça.

Exemple :

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

Sorties : -downcase-gsub-a-z1-9-chomp

6voto

Victor S Points 1615

Je l'ai un peu modifié pour créer des tirets à la place des underscores, si cela intéresse quelqu'un :

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X