Skip to content


Cómo añadir tags a nuestros modelos

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.

Posted in Projects, RubyOnRails, Tips & Tricks.

Tagged with , .


One Response

Stay in touch with the conversation, subscribe to the RSS feed for comments on this post.

  1. jenaiz.com says

    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



Some HTML is OK

or, reply to this post via trackback.