1

嘗試過各種不同的方法 - 看起來似乎無法解決此問題 - 您的幫助將會非常棒!Rails - acts-as-taggable-on gem - 如何根據標記數量更改標記的CSS樣式

當用戶創建他們可以通過acts-as-taggable-on gem標記它。如果用戶在各個帖子上寫入標籤2次或更多,我試圖製作該標籤,然後使用與使用的其他標籤不同的CSS樣式。

例如,如果用戶創建三個柱:http://imgur.com/zQEWcRo

  • POST1標記爲 「#foo #bar #foobar
  • POST2標記爲「#foobar #placeholder
  • Post3 tagged with」#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 

回答

0

這實際上很容易。每個作爲標籤的標籤都有一個標籤計數。

例如:

post.tags.order("taggings_count DESC") 

爲你的榜樣崗位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。

編輯:

這是你如何能呈現例如標籤:

<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 
+0

驚人的 - 完美的作品 - 英雄! – domburford

0

首先,您需要知道某個標籤是否曾經使用過。你可以做到這一點:

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中添加一個特定的類(比如'used')。erb(我建議你查找苗條/ 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> 
+0

非常感謝!不幸的是,我似乎無法得到這個解決方案的工作......我已經將我的模式添加到SO後 - 我希望這有助於!任何反饋都會很棒 - 再次感謝! – domburford