Rails - acts-as-taggable-on gem - 如何根据标签计数更改标签的 CSS 样式
Rails - acts-as-taggable-on gem - How to change a tag's CSS style depending on it's tag count
尝试了各种不同的方法 - 似乎无法解决这个问题 - 你的帮助会很棒!
当用户创建 Post 时,他们可以通过 acts-as-taggable-on gem 对其进行标记。如果用户在 Post 中写了一个标签 2 次或更多次,我正在尝试使该标签具有与其他使用的标签不同的 CSS 样式。
例如,如果用户创建了三个帖子:http://imgur.com/zQEWcRo
- Post1 标记为“#foo #bar #foobar”
- Post2 标记为“#foobar #placeholder”
- Post3 标记为“#foobar #foo”
我正在尝试让 #foobar 具有不同于其他标签的 CSS 样式(#foo #bar #placeholder) 在所有帖子中(最好将 #foobar 移动到序列中的第一个标签)
new.html.erb
<%= form_for @post, html: { multipart: true } do |f| %>
<%= f.text_field :tag_list %>
<%= f.submit %>
<% end %>
posts_controller.rb
class PostsController < ApplicationController
def index
if params[:tag]
@posts = Post.tagged_with(params[:tag]).order(created_at: :desc).page(params[:page]).per_page(2)
else
@posts = Post.all.order(created_at: :desc).page(params[:page]).per_page(2)
end
end
index.html.erb
<div id="posts">
<%= render @posts %>
</div>
<%= will_paginate @posts %>
_post.html.erb
<div class="post">
<%= raw post.tag_list.map {|t| link_to t, tag_path(t)}.join(' ') %>
</div>
<% post.things.order(:order).each do |thing| %>
<%= thing.try(:text) %>
<% end %>
架构
ActiveRecord::Schema.define(version: 20160227154831) do
create_table "posts", force: :cascade do |t|
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
end
create_table "taggings", force: :cascade do |t|
t.integer "tag_id"
t.integer "taggable_id"
t.string "taggable_type"
t.integer "tagger_id"
t.string "tagger_type"
t.string "context", limit: 128
t.datetime "created_at"
end
add_index "taggings", ["tag_id", "taggable_id", "taggable_type", "context", "tagger_id", "tagger_type"], name: "taggings_idx", unique: true
add_index "taggings", ["taggable_id", "taggable_type", "context"], name: "index_taggings_on_taggable_id_and_taggable_type_and_context"
create_table "tags", force: :cascade do |t|
t.string "name"
t.integer "taggings_count", default: 0
end
add_index "tags", ["name"], name: "index_tags_on_name", unique: true
create_table "things", force: :cascade do |t|
t.text "text"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
end
end
首先你需要知道之前是否使用过某个标签。您可以通过以下方式实现:
Post.tag_counts_on(:tags).where(name: your_tag_name).present?
我建议你将其放入 post.rb 中,例如:
def self.tag_used?(tag)
self.tag_counts_on(:tags).where(name: tag.name).present?
end
(将自己切换为您想要的帖子范围(例如 user.posts))
因此,当您知道之前是否使用过标签时,您可以在 _post.html.erb 中添加特定的 class(比如 'used')(我还建议您查找 slim/haml 标记语言):
<div class="post">
<%= raw post.tag_list.map { |t| link_to t, tag_path(t), class: ('used' if Post.tag_used?(t)) }.join(' ') %>
</div>
这其实很容易。每个 acts-as-taggable-on 标签都有一个标记计数。
例如:
post.tags.order("taggings_count DESC")
对于 post 你的例子 1 会给你这个:
<ActsAsTaggableOn::Tag id: some_id, name: "foobar", taggings_count: 3>,
<ActsAsTaggableOn::Tag id: some_id, name: "foo", taggings_count: 2>,
<ActsAsTaggableOn::Tag id: some_id, name: "bar", taggings_count: 1>
现在您的标签已按出现次数排序,您还可以根据 taggings_count 显示不同的 class。
编辑:
这就是您呈现标签的方式,例如:
<div class="post">
<%= raw post.tags.order("taggings_count DESC").map {|t| link_to t.name, tag_path(t.name), class: css_class_for_tag(t.taggings_count)}.join(' ') %>
</div>
然后您需要定义辅助方法 css_class_for_tag,例如:
def css_class_for_tag count
case count
when 0
'new_tag'
else
'used_tag'
end
end
尝试了各种不同的方法 - 似乎无法解决这个问题 - 你的帮助会很棒!
当用户创建 Post 时,他们可以通过 acts-as-taggable-on gem 对其进行标记。如果用户在 Post 中写了一个标签 2 次或更多次,我正在尝试使该标签具有与其他使用的标签不同的 CSS 样式。
例如,如果用户创建了三个帖子:http://imgur.com/zQEWcRo
- Post1 标记为“#foo #bar #foobar”
- Post2 标记为“#foobar #placeholder”
- Post3 标记为“#foobar #foo”
我正在尝试让 #foobar 具有不同于其他标签的 CSS 样式(#foo #bar #placeholder) 在所有帖子中(最好将 #foobar 移动到序列中的第一个标签)
new.html.erb
<%= form_for @post, html: { multipart: true } do |f| %>
<%= f.text_field :tag_list %>
<%= f.submit %>
<% end %>
posts_controller.rb
class PostsController < ApplicationController
def index
if params[:tag]
@posts = Post.tagged_with(params[:tag]).order(created_at: :desc).page(params[:page]).per_page(2)
else
@posts = Post.all.order(created_at: :desc).page(params[:page]).per_page(2)
end
end
index.html.erb
<div id="posts">
<%= render @posts %>
</div>
<%= will_paginate @posts %>
_post.html.erb
<div class="post">
<%= raw post.tag_list.map {|t| link_to t, tag_path(t)}.join(' ') %>
</div>
<% post.things.order(:order).each do |thing| %>
<%= thing.try(:text) %>
<% end %>
架构
ActiveRecord::Schema.define(version: 20160227154831) do
create_table "posts", force: :cascade do |t|
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
end
create_table "taggings", force: :cascade do |t|
t.integer "tag_id"
t.integer "taggable_id"
t.string "taggable_type"
t.integer "tagger_id"
t.string "tagger_type"
t.string "context", limit: 128
t.datetime "created_at"
end
add_index "taggings", ["tag_id", "taggable_id", "taggable_type", "context", "tagger_id", "tagger_type"], name: "taggings_idx", unique: true
add_index "taggings", ["taggable_id", "taggable_type", "context"], name: "index_taggings_on_taggable_id_and_taggable_type_and_context"
create_table "tags", force: :cascade do |t|
t.string "name"
t.integer "taggings_count", default: 0
end
add_index "tags", ["name"], name: "index_tags_on_name", unique: true
create_table "things", force: :cascade do |t|
t.text "text"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
end
end
首先你需要知道之前是否使用过某个标签。您可以通过以下方式实现:
Post.tag_counts_on(:tags).where(name: your_tag_name).present?
我建议你将其放入 post.rb 中,例如:
def self.tag_used?(tag)
self.tag_counts_on(:tags).where(name: tag.name).present?
end
(将自己切换为您想要的帖子范围(例如 user.posts))
因此,当您知道之前是否使用过标签时,您可以在 _post.html.erb 中添加特定的 class(比如 'used')(我还建议您查找 slim/haml 标记语言):
<div class="post">
<%= raw post.tag_list.map { |t| link_to t, tag_path(t), class: ('used' if Post.tag_used?(t)) }.join(' ') %>
</div>
这其实很容易。每个 acts-as-taggable-on 标签都有一个标记计数。
例如:
post.tags.order("taggings_count DESC")
对于 post 你的例子 1 会给你这个:
<ActsAsTaggableOn::Tag id: some_id, name: "foobar", taggings_count: 3>,
<ActsAsTaggableOn::Tag id: some_id, name: "foo", taggings_count: 2>,
<ActsAsTaggableOn::Tag id: some_id, name: "bar", taggings_count: 1>
现在您的标签已按出现次数排序,您还可以根据 taggings_count 显示不同的 class。
编辑:
这就是您呈现标签的方式,例如:
<div class="post">
<%= raw post.tags.order("taggings_count DESC").map {|t| link_to t.name, tag_path(t.name), class: css_class_for_tag(t.taggings_count)}.join(' ') %>
</div>
然后您需要定义辅助方法 css_class_for_tag,例如:
def css_class_for_tag count
case count
when 0
'new_tag'
else
'used_tag'
end
end