La meilleure façon de générer des limaces (ID lisibles par l'homme) dans Rails
-
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
En fait, il semble que les limaces sont un problème totalement résolu, et je ne pas réinventer la roue.
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
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.