Estoy seguro que más de una vez habéis visto nubes de tags en variedad de sitios webs, a la vez que las habéis utilizado, pues bien, existe un plugin en rails que puede haceros las delicias, para poder tagear cualquier modelo con el que estéis trabajando.
La historia de este plugin, es que David Heinemeier Hansson creó un plugin para poder poner tags a sus modelos, llamado: acts_as_taggable, sin embargo alguien decidió hacerle unos añadidos para convertirlo en más actual, haciendo que el nuevo plugin tuviese:
[...] extras such as tests, smarter tag assignment, and tag cloud calculations.
Este nuevo plugin recibió el nombre de acts_as_taggable_on_steroids y es obra de Jonathan Viney.
Para instalarlo, nuestro primer paso debe ser:
script/plugin install http://svn.viney.net.nz/things/rails/plugins/acts_as_taggable_on_steroids
Tras esto, debemos generar una migración para poder crear la tablas en las que se guardaran los datos:
script/generate acts_as_taggable_migration
Esto nos genera:
004_acts_as_taggable_migration.rb
el número no tiene porqué coincidir con el vuestro; aplicamos la migración:
rake db:migrate
Y ahora ya sólo nos queda hacer que nuestro controlador sea tageable:
class Entry < ActiveRecord::Base acts_as_taggable end
Para añadir tags en el formulario de edición o en el de creación de nuestro modelo concreto, en nuestro caso: entries/new.html.erb y entries/edit.html.erb, basta con la siguiente línea de código:
<%= f.text_field :tag_list %>
así nuestras entradas utilizarán tags y se guardarán.
Nuestro modelo cuenta con una serie de métodos para jugar con tags. Uno que debéis esperar, al ver como he llamado al text_field de los tags, es sin duda:
entry.tag_list = "ruby, rails" entry.save
Con él añadimos los tags a entry, tras grabarlo.
Podemos añadir a una lista ya existente:
entry.tag_list.add("languages", "article")
borrar una etiqueta concreta:
entry.tag_list.remove("ruby")
Podemos encontrar las entradas taggeadas con unas determinadas tags:
Entry.find_tagged_with('ruby, rails')
Esto nos traera objetos que contenga cualquiera de las dos tags, si queremos que contengan las dos o más, tenemos que usar match_all.
Entry.find_tagged_with('ruby, rails', :match_all => true)
Por defecto el delimitador es una coma, si deseamos cambiarlo, también tenemos esa opción:
TagList.delimiter = " "
añadido al config/environment.rb, quedaría cambiado el delimitador.
El otro día cuando hablábamos de poder taggear modelos, os puse el ejemplo de las nubes de tags que vemos en innumerables ocasiones, sin embargo sólo avanzamos hasta disponer de un modelo tageable.
Ahora os voy a mostrar cómo se podría construir la nub