【问题标题】:Rails - acts-as-taggable-on gem - How to change a tag's CSS style depending on it's tag countRails - 作为可标记的 gem - 如何根据标签数量更改标签的 CSS 样式
【发布时间】:2016-06-13 23:57:24
【问题描述】:

尝试了各种不同的方法 - 似乎无法解决这个问题 - 你的帮助将是惊人的!

当用户创建帖子时,他们可以通过acts-as-taggable-on gem 对其进行标记。如果用户在帖子中写了 2 次或更多标签,我正在尝试制作该标签,则其 CSS 样式与使用的其他标签不同。

例如,如果用户创建了三个帖子:http://imgur.com/zQEWcRo

  • Post1 标记为“#foo #bar #foobar
  • Post2 标记为“#foobar #placeholder
  • Post3 标记为“#foobar #foo

我正在尝试让 #foobar 在所有帖子(最好移动#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

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-4 rubygems hashtag acts-as-taggable-on


    【解决方案1】:

    这其实很简单。每个作为可标记的标记都有一个标记计数。

    例如:

    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
    

    【讨论】:

      【解决方案2】:

      首先你需要知道之前是否使用过某个标签。您可以通过以下方式实现:

      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 中添加特定的类(比如说“使用过”)(我也建议您查找 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>
      

      【讨论】:

      • 非常感谢!不幸的是,我似乎无法让这个解决方案工作......我已将我的架构添加到 SO 帖子中 - 我希望这会有所帮助!任何反馈都会很棒 - 再次感谢!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-07-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-02-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多