Ruby on Rails permette di aggiungere nuove funzionalità alla propria applicazione per mezzo di plugin, ovvero librerie pronte ad essere incapsulate nel proprio progetto. Acts as taggable on steroid è un plugin che permette di taggare uno i più modelli; vediamo come installare il plugin e ad abilitare il tagging per il modello bookmark
.
Dal terminale fermiamo il server con il comando CTRL+C
e digitiamo l'istruzione per installare il plugin.
Installare il plugin "Acts as taggable on steroid"
$ ruby script/plugin install http://svn.viney.net.nz/things/rails/plugins/acts_as_taggable_on_steroids
+ ./CHANGELOG
+ ./MIT-LICENSE
+ ./README
...
+ ./test/tagging_test.rb
+ ./test/tags_helper_test.rb
Tutti i file necessari al funzionamento del plugin vengono scaricati direttamente da internet e posizionati nella cartella vendor/plugins
. Seguendo le istruzioni del plugin, procediamo ora alla migrazione del database, ovvero a creare le tabelle che saranno utilizzate dal plugin stesso per salvare i tag e le relazioni fra tag e risorse Bookmark.
Creiamo il file per la migrazione che descrive quali tabelle devono essere aggiunte e come sono composte:
ruby script/generate acts_as_taggable_migration
Procediamo quindi alla migrazione vera e propria del database, ovvero alla creazione delle tabelle nel nostro database:
$ rake db:migrate == 20080602145658 ActsAsTaggableMigration: migrating ========================== -- create_table(:tags) -> 0.0040s -- create_table(:taggings) -> 0.0045s -- add_index(:taggings, :tag_id) -> 0.0059s -- add_index(:taggings, [:taggable_id, :taggable_type]) -> 0.0034s == 20080602145658 ActsAsTaggableMigration: migrated (0.0189s) =================
Ora che i file del plugin sono disponibili all'interno del progetto e che le tabelle sono state create, possiamo indicare quale modello deve essere interessato dal tagging; apriamo il file app/models/bookmarks.rb
e modifichiamolo come segue:
class Bookmark < ActiveRecord::Base
acts_as_taggable
...
end
Con l'istruzione acts_as_taggable
tutti i bookmark sono diventati taggabili; dal terminale apriamo la console (ruby script/console
) e proviamo ad abbinare qualche tag ad un bookmark. Incominciamo estraendo dal database il primo bookmark disponibile:
>> b = Bookmark.find(:first) => #<Bookmark id: 1, url: "http://ruby.html.it", title: "Ruby su HTML.it", description: "Home page della sezione Ruby. Guide, articoli di ap...", created_at: "2008-06-02 00:20:12", updated_at: "2008-06-02 00:20:12">
Accediamo al metodo tag_list, reso disponibile dal plugin, che restituisce tutti i tag abbinati ad un particolare bookmark:
>> b.tag_list => []
Il bookmark non ha ancora alcun tag; assegniamo alcuni tag al bookmark, separando i tag con una virgola:
>> b.tag_list = "ruby, rails, guida" => "ruby, rails, guida"
Infine salviamo il bookmark:
>> b.save => true
Ora il nostro bookmark è stato taggato; proviamo ad estrarre, con un comando messo a disposizione dal plugin, tutti i bookmark taggati con l'etichetta "Rails"
>> Bookmark.find_tagged_with("Rails") => [#<Bookmark id: 1, url: "http://ruby.html.it", title: "Ruby su HTML.it", description: "Home page della sezione Ruby. Guide, articoli di ap...", created_at: "2008-06-02 00:20:12", updated_at: "2008-06-02 00:20:12">]
Non ci resta che esporre queste funzionalità tramite le pagine della nostra applicazione; apriamo il file app/views/bookmarks/index.html.erb
per aggiungere nella pagina di elenco di tutti i bookmark i relativi tag:
... <%= bookmark.description %><br /> Tag: <%= bookmark.tag_list %><br /> <small> <%= link_to 'Show', bookmark %> | ...
Aggiungendo l'istruzione
<%= bookmark.tag_list %>
chiediamo di stampare a video tutti i tag relativi al bookmark rappresentato dalla variabile bookmark. Avviamo il server e accediamo alla pagina http://0.0.0.0:3000/bookmarks
per osservare il risultato; subito sotto la descrizione di ogni bookmark appaiono, quando disponibili, i tag che abbiamo inserito.
Se accediamo alla pagina di creazione di un nuovo bookmark dal link New Bookmark
, notiamo che non è possibile inserire i tag, dal momento che il form è rimasto invariato. Abbiamo visto che per abbinare i tag ad un bookmark è sufficiente l'istruzione
b.tag_list = "ruby, rails, guida"
quello che dobbiamo fare è quindi aggiungere un nuovo campo che dia la possibilità all'utente di inserire il valore "ruby, rails, guida" per l'attributo tag_list
, così come capita già per title
, url
e description
.
Apriamo il file app/views/bookmarks/new.html.erb
e aggiungiamo un nuovo campo di input subito sotto il campo dedicato alla descrizione:
... <%= f.text_area :description %> </p> <p>Tag: <%= f.text_field :tag_list %></p> ...
Apportiamo la stessa modifica al file app/views/bookmarks/edit.html.erb
, così da poter modificare i tag per i bookmark già inseriti.
Ora abbiamo la possibilità di specificare differenti tag per ogni bookmark inserito, sia nella pagina di creazione di un nuovo bookmark, sia in quella di modifica. Non ci rimane che preparare una pagina di aggregazione per tutti i bookmark che hanno un determinato tag in comune; creando un controller e una vista.