web-dev-qa-db-fra.com

Ruby titre du post à slug

Comment convertir un titre de publication en slug dans Ruby?

Le titre peut avoir n'importe quel caractère, mais je veux seulement que le slug autorise [a-z0-9-_] (Doit-il autoriser d'autres caractères?).

Donc en gros:

  • télécharger toutes les lettres
  • convertir des espaces en tirets
  • supprimer les caractères superflus
48
ma11hew28
slug = title.downcase.strip.gsub(' ', '-').gsub(/[^\w-]/, '')

downcase le met en minuscule. strip s'assure qu'il n'y a pas d'espace blanc de début ou de fin. Le premier gsub remplace les espaces par des tirets. Le second gsub supprime tous les caractères non-alpha non-dash non-soulignés (notez que cet ensemble est très proche de \W mais inclut également le tiret, c'est pourquoi il est expliqué ici).

78
Ben Lee

Est-ce que c'est Rails?

string.parameterize

C'est tout. Pour un slugging encore plus sophistiqué, voir ActsAsUrl . Il peut effectuer les opérations suivantes:

"rock & roll".to_url => "rock-and-roll"
"$12 worth of Ruby power".to_url => "12-dollars-worth-of-Ruby-power"
"10% off if you act now".to_url => "10-percent-off-if-you-act-now"
"kick it en Français".to_url => "kick-it-en-francais"
"rock it Español style".to_url => "rock-it-espanol-style"
"tell your readers 你好".to_url => "tell-your-readers-ni-hao"
94
Mark Thomas

to_slug est un excellent plugin Rails qui gère à peu près tout, y compris les personnages funky, mais son implémentation est très simple. Jetez-le sur String et vous serez trié. Voici la source condensée:

String.class_eval do
  def to_slug
    value = self.mb_chars.normalize(:kd).gsub(/[^\x00-\x7F]/n, '').to_s
    value.gsub!(/[']+/, '')
    value.gsub!(/\W+/, ' ')
    value.strip!
    value.downcase!
    value.gsub!(' ', '-')
    value
  end
end
7
Jamie Rumbelow

J'ai utilisé ce bijou, c'est simple mais utile.

https://rubygems.org/gems/string_helpers

3
Diego Montadori

J'aime FriendlyId, le soi-disant "bulldozer de l'armée suisse" de création de limaces. https://github.com/norman/friendly_id

0
Aaron Sumner