2009年8月4日火曜日

[Rails][習作] 簡易ブックマークアプリ (4)

indexページにタグクラウドを追加してみます。
変更するのは、indexアクションとビューのみ。


# bookmarks_controller.rb
def index
bookmarks_all = Bookmark.find(:all, :order=>"created_at desc")
tags_all = Tag.find(:all)
# Tag Cloud (タグのリスト)作成
@tag_cloud = Array.new
tags_all.each do |t|
@tag_cloud << t.tag if !@tag_cloud.include? t.tag
end

# search by created date
year = params[:year]
month = params[:month]
if year != nil && month != nil
first_of_month = Time.mktime(year.to_i, month.to_i, 1, 0, 0)
first_of_next_month = first_of_month.next_month.beginning_of_month
@bookmarks = Bookmark.find(:all, :conditions=>"created_at >= '#{first_of_month}' AND created_at < '#{first_of_next_month}'", :order=>"created_at desc")
else
@bookmarks = bookmarks_all
end

# search by tags
# パラメータで渡されたタグで絞り込む
tag = params[:tag]
if tag != nil
@bookmarks = Bookmark.find(:all, :conditions=>"EXISTS (SELECT * FROM tags WHERE tags.bookmark_id = bookmarks.id AND tags.tag = '#{tag}')")
end

# 作成月のハッシュ
@created = Hash.new
bookmarks_all.each{ |bookmark|
year = bookmark.created_at.year
month = bookmark.created_at.month
if !@created.key? year
@created.store year, [month]
elsif !@created[year].include? month
@created[year] << month
end
}

respond_to do |format|
format.html # index.html.erb
format.xml { render :xml => @bookmarks }
end
end




# index.html.erb (追加部分のみ)
# タグの表示と絞込みのリンク作成
<div style="font-weight: bold; text-align: center; color: green;">Tag Cloud</div>
<div style="margin: 3px; padding: 10px; border: solid 2px green;">
<% @tag_cloud.each do |tag| %>
<%= link_to tag, bookmarks_path(:tag=>tag) %>
<% end %>
</div>

右ペイン下の"Tag Cloud"ボックスが追加箇所になります。
画面は、Tag Cloud の "RubyOnRails"をクリックして絞り込んだ様子。
URL : http://hostname:port/bookmarks?tag=RubyOnRails

ところで、Rails って同名の複数リクエストパラメータを渡す場合はどうするのでしょうか。
普通に
http://hostname:port/bookmarks?tag=Rails&tag=RubyOnRails
とすると、
Parameters: {"tag"=>"RubyOnRails"}
と後のパラメータ値で上書きされてしまう。。。


<<[Rails][習作] 簡易ブックマークアプリ (3)

0 件のコメント:

コメントを投稿