接續 上一篇 [RoR] 小小複雜模仿 del.icio.us 的個人化的社會標籤 per user tagging 來分享 使用者增減標籤界面的簡單做法。
使用者增減標籤的界面
在 app/controllers/bibles_controller.rb 加入
include AuthenticatedSystem
before_filter :login_required, :only => [ :new, :create, :edit, :update, :destroy ]
才不會讓全世界的人都作這些動作,而像 new, create, destroy 這三個項目,就將其 action 拿掉,或者變成只秀出禁止動作的字樣。
只讓已登入的使用者才可看到 編輯標籤 的連結:
# 在 app/views/bibles/show.html.erb 適當位置加入:
<% if is_logged_in? %>
<%= link_to '編輯標籤', edit_bible_path(@bible) %>
<% end %>
在 app/views/bibles/edit.html.erb 主要把該經文中已有該 user 曾加入的 標籤 取出來放到 form 裡供增減
<h1>編輯標籤</h1>
<%= error_messages_for :bible %>
<% form_for(@bible) do |f| %>
<p>
<%= @bible.chinesef -%><%= @bible.chap -%>:<%= @bible.sec -%><br />
<%= @bible.txt %>
</p>
<p>
標籤:
<% darray = []
Tag.userid_itemid(current_user.id, @bible.id,'Bible').each do |t| darray.push(t.name)
end %>
<%= text_field_tag 'tag', darray.join(' ') %>
</p>
<p>
<%= f.submit "更新標籤", :name => nil -%>
</p>
<% end %>
<%= link_to '回本節經文', @bible %> |
<%= link_to '回聖經首頁', bibles_path %>
而更新部份的 action,只要去更新 標籤 的欄位,其他部份不去更新即可。
def update
@bible = Bible.find(params[:id])
respond_to do |format|
#只要改成這一行:
if @bible.tag(params[:tag].split(' ').join(','),current_user.id)
flash[:notice] = '已更新標籤'
format.html { redirect_to(@bible) }
...
社會標籤的應用
透過以上的介紹,Social Tagging 的基本機制便可實作出來,運作的範例 demo 在: http://alpha.tagbible.net/bibles 。目前在網路上看到的標籤,許多只是 該文章的作者,為自己的文章下標籤,只算是個人標籤,只對自己較有意義,但別人不能去加,最多是透過 del.icio.us 之類的第三方書籤網站,來對該文去定義自己覺得可以代表的標籤。
透過本文的作法,等於是可以讓自己的網站與 del.icio.us 有同樣的功能,讓使用者在自己站註冊,去對自己網站所提供的資料來下標籤,本文的例子是用聖經經文,就可以把對自己對某節經文可以有什麼屬性來作書籤,在這樣彼此相連結的作法下,就更容易把一個概念,串連出一堆自己原來沒有注意到的經文出來。
同樣地,所要標籤的對象,可以把 聖經經文,置換成像:
新聞、雜誌內容:通常只有透過基本類別、全文檢索的方式,且又排序到很後面,才能指到古早文章,若有不同人去標籤,就更能提高使用率。
圖書館的書目資料:透過各讀者對書所下的標籤,可把相關的讀者及其所關注的標籤議題,及相關的書關連起來。
書店的書目資料:同上。
電影資料:通常網路上看到的電影資料庫,都只有單純的單一分類,若可讓使用者加標籤,就可從不同的相關字眼,都指到同一步電影名稱。
…
基本上,只要是會累積成大量的資料,若能加上 Social Tagging 的機制,能補上全文檢索的不足,而可以透過使用者的 定義、意義、標籤、關鍵字、代表字眼 不同詮釋來連結到該資料。而更有趣的是,也可以透過 標籤 來做到像 http://www.blogger.com/profile/4 興趣、喜好…給串起來。
在這個 Web 2.0 的環境中,只能說 RoR 是一個使 Web 2.0 的功能可以垂手可得的方便工具,比起其他的程式環境是相當簡單地達成任務。