La meilleure façon de générer des limaces (ID lisibles par l'homme) dans Rails

StackOverflow https://stackoverflow.com/questions/1302022

  •  19-09-2019
  •  | 
  •  

Question

Vous savez, comme myblog.com/posts/donald-e-knuth.

Dois-je faire avec le construit en parameterize méthode ?

Qu'en est-il un plugin? Je pourrais imaginer un plug-in étant agréable pour manipuler les limaces en double, etc. Voici quelques plugins Github populaires - ce que quelqu'un a une expérience avec eux

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

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

Était-ce utile?

La solution

J'utilise ce qui suit, qui sera

  • translate & -> "et" et @ -> "à"
  • ne pas insérer un trait de soulignement en place d'une apostrophe, alors "Foo" -> "Les foos"
  • ne comprend pas double-underscores
  • ne crée pas de limace 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

, par exemple:


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

Autres conseils

Rails vous pouvez utiliser #parameterize

Par exemple:

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

La meilleure façon de générer des limaces est d'utiliser le joyau Unidecode . Il est de loin la plus grande base de données de translittération disponibles. Il a même translittération des caractères chinois. Sans parler couvrant toutes les langues européennes (y compris les dialectes locaux). Il garantit une création de limace pare-balles.

Par exemple, considérons celles-ci:

"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 ruby_extensions plug-in . Voir ruby_extensions.rb pour la méthode to_slug.

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

Assez explicite, bien que le seul problème est s'il y a déjà le même, il 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

Je l'ai modifié un peu pour créer des tirets au lieu de underscores, si quelqu'un est intéressé:

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

Le principal problème pour mes applications a été les apostrophes -. Est-ce que vous voulez rarement -s assis là-bas sur son propre

class String

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

end

Le joyau Unidecoder n'a pas été mis à jour depuis 2007.

Je vous recommande la pierre précieuse stringex, qui comprend toutes les fonctionnalités de la pierre précieuse Unidecoder.

https://github.com/rsl/stringex

En regardant son code source, il semble reconditionner le code source Unidecoder et ajouter de nouvelles fonctionnalités.

Nous utilisons to_slug http://github.com/ludo/to_slug/tree/master. Est-ce que tout ce dont nous avons besoin pour faire (sortir des «personnages funky). Espérons que cela aide.

EDIT:. Semble à briser mon lien, désolé

Récemment, j'ai eu le même dilemme.

Depuis, comme vous, je ne veux pas réinventer la roue, j'ai choisi friendly_id après la comparaison sur la boîte à outils Ruby: Rails Permalinks & limaces .

Je fondé ma décision sur:

  • nombre d'observateurs d'GitHub
  • non. des fourches github
  • quand remonte la dernière livraison faite
  • non. de téléchargements

Espérons que cela aide à prendre la décision.

J'ai trouvé la pierre précieuse Unidecode d'être beaucoup trop lourd, charger près de 200 fichiers YAML, pour ce que je avais besoin. Je savais que iconv avait un certain soutien pour les traductions de base, et alors qu'il est pas parfait, il est construit et assez léger. C'est ce que je suis venu avec:

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

Il est évident que vous devriez probablement ajouter comme une méthode d'instance sur tous les objets que vous courrez sur, mais pour plus de clarté, je n'ai pas.

Avec Rails 3, j'ai créé un initialiseur, slug.rb, dans lequel j'ai mis le code suivant:

class String
  def to_slug
    ActiveSupport::Inflector.transliterate(self.downcase).gsub(/[^a-zA-Z0-9]+/, '-').gsub(/-{2,}/, '-').gsub(/^-|-$/, '')
  end
end

Je l'utilise partout où je veux dans le code, il est défini pour une chaîne.

Le transliterate transforme les choses comme é, á, e S dans, a, o. Comme je développe un site en portugais, que les questions.

Je sais que cette question a un certain temps maintenant. Cependant, je vois des réponses relativement nouvelles.

Enregistrer la limace sur la base de données est problématique, et vous enregistrez des informations redondantes qui est déjà là. Si vous pensez à ce sujet, il n'y a aucune raison pour sauver la limace. La limace doit être logique, pas de données.

J'ai écrit un message suivant ce raisonnement, et l'espoir est d'un peu d'aide.

http://blog.ereslibre.es/?p=343

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top