Rails : act_as_taggable_on_steroids, les tags faciles
Il arrive régulièrement, sur divers projets, que l’on ait besoin de gérer des tags. Que ce soit pour un catalogue d’articles, son blog personnel ou une plateforme de photoblog, ceux-ci peuvent toujours avoir une utilité.
Le plugin rails "act_as_taggable_on_steroids" permet cela de manière on ne peut plus simple.
Mise en application et exemple (cet article est une traduction plus ou moins libre de la documentation du plugin).
Pour commencer, installons le plugin.
script/plugin install http://svn.viney.net.nz/things/rails/plugins/acts_as_taggable_on_steroids
Puis mettons en place les deux bases nécessaires à l’exécution de notre plugin : tags et taggings.
script/generate acts_as_taggable_migration
Et créons les.
rake db:migrate
Ne créez pas de modèle pour votre base "tags". Celui-ci est déjà présent dans le plugin et est nécessaire à son bon fonctionnement.
Notez qu’il est nécessaire de redémarrer le serveur (même dans un environnement de développement tel que aptana) pour que le plugin soit réellement installé.
Voila, le plugin est en place. Maintenans, ajoutons des tags à notre modèle "Post".
class Post < ActiveRecord::Base
acts_as_taggable
end
Ajouter "act_as_taggable" permet de déclarer le modèle comme ayant un tag. Les bases utilisées seront toujours tags et taggings. Même si vous avez plusieurs modèles utilisant des tags (mais les tags ne sont pas mélangés).
Vous pouvez maintenant mettre à jour la liste des tags pour un uplet :
p = Post.find(params[:id])
p.tag_list = ‘kazhar,blog,ruby,rails’
Plusieurs autres fonctionnalités sont également disponibles, pour ajouter ou supprimer manuellement des tags.
Ajouter un (ou plusieurs) tag(s) :
p.tag_list.add('développement', 'rubyonrails')
Supprimer un ou plusieurs tags :
p.tag_list.remove('rubyonrails')
Obtenir les données des tags
Après avoir définir nos tags, on peut bien evidemment en récupérer le contenu. La méthode find_tagged_with permet d’obtenir tous les billets possédant un ou plusieurs tags.
Post.find_tagged_with('kazhar')
Par défaut,si un élément contient au moins un des tags présents dans la liste. Si vous désirez chercher tous les tags présents dans la liste, il faut ajouter l’option match_all.
Post.find_tagged_with('kazhar,ruby', :match_all => true)
Nuage de tags
L’intéret principal d’avoir des tags est de créer un nuage. Bien evidemment, ce plugin permet cela de manière très aisée. Commençons, dans notre contrôleur, par récupérer la liste des tags pour tous nos billets.
@tags = Post.tag_counts
Puis dans notre vue, nous affichons tous nos tags en leur attribuant une classe spécifique en fonction de leur taille.
<% tag_cloud @tags, %w(tag1 tag2 tag3 tag4) do |tag, css_class| %>
<%= link_to tag.name, { :action => :tag, :id => tag.name }, :class => css_class %>
<% end %>
Et nous définissons ces tailles dans notre feuille de style.
.tag1 { font-size: 1.0em; }
.tag2 { font-size: 1.2em; }
.tag3 { font-size: 1.4em; }
.tag4 { font-size: 1.6em; }
Et voila, vous avez maintenant un beau nuage de tags ! Le tout en moins d’une heure si tout s’est passé correctement !
Quelques petites options supplémentaires :
- Délimiteur : par défaut, les divers tags sont séparés par une virgule (","). Mais il est possible de modifier cela avec TagList.delimiter.
Définissez le dans environnment.rb. Par exemple : TagList.delimiter = ‘.’ - Suppression des tags inutilisés : par défaut, le plugin ne supprime pas les tags inutilisés. Cependant, il est possible de modifier cela.
Toujours dans environnment.rb : TagList.unused = true

