Я реализовал облака тегов в Ruby on Rails с нуля, используя это руководство.
Когда вы нажимаете на тег в моем фотоблоге, скажем, Токио, отображаются все фотографии с тегами Токио. Теперь я хочу добавить 2 вещи, чтобы сделать мое облако тегов более динамичным, чтобы вы могли сузить списки:
- Облако тегов должно обновляться динамически, чтобы теперь в нем отображались только теги, связанные с оставшимися фотографиями, подмножеством Tokyo (с размером шрифта, масштабируемым относительно этого подмножества).
- Когда вы нажимаете тег в этом облаке подмножества тегов, скажем 2008, я хочу, чтобы в списке были перечислены все фотографии, помеченные тегами Tokyo и 2008 (вместо всех фотографий с тегами 2008), предпочтительно до бесконечности.
Я новичок в Ruby и, кажется, просто не могу выполнить ни одно из них, что бы я ни пробовал (слишком много, чтобы перечислять здесь).
Вот соответствующий код:
photo.rb:
class Photo < ActiveRecord::Base
belongs_to :photo
has_many :taggings, dependent: :destroy
has_many :tags, through: :taggings
accepts_nested_attributes_for :tags
def self.tagged_with(name)
Tag.find_by_name!(name).photos
end
def self.tag_counts
Tag.select("tags.*, count(taggings.tag_id) as count").
joins(:taggings).group("taggings.tag_id")
end
tag.rb:
class Tag < ActiveRecord::Base
has_many :taggings
has_many :photos, through: :taggings
end
tagging.rb:
class Tagging < ActiveRecord::Base
belongs_to :tag
belongs_to :photo
end
application_helper.rb:
module ApplicationHelper
def tag_cloud(tags, classes)
max = 0
tags.each do |t|
if t.count.to_i > max
max = t.count.to_i
end
end
tags.each do |tag|
index = tag.count.to_f / max * (classes.size - 1)
yield(tag, classes[index.round])
end
end
end
photos_controller.rb:
class PhotosController < ApplicationController
def index
if params[:tag]
@photos = Photo.tagged_with(params[:tag])
else
@photos = Photo.order("created_at desc").limit(8)
end
end
private
def set_photo
@photo = Photo.find(params[:id])
end
def photo_params
params.require(:photo).permit(:name, :description, :picture, :tag_list, tags_attributes: :name)
end
end
index.html.erb:
<div id="tag_cloud">
<% tag_cloud Photo.tag_counts, %w[xxs xs s m l xl xxl] do |tag, css_class| %>
<%= link_to tag.name, tag_path(tag.name), class: css_class %>
<% end %>
</div>
photos.css.scss:
#tag_cloud {
width: 400px;
line-height: 1.6em;
.xxs { font-size: 0.8em; COLOR: #c3c4c4; }
.xs { font-size: 1.0em; COLOR: #b9bdbd; }
.s { font-size: 1.2em; COLOR: #b0b5b5; }
.m { font-size: 1.4em; COLOR: #9da6a6; }
.l { font-size: 1.6em; COLOR: #8a9797; }
.xl { font-size: 1.8em; COLOR: #809090; }
.xxl { font-size: 2.0em; COLOR: #778888; }
}
Любая помощь будет высоко ценится!