Список всех тегов для act_as_taggable

У меня есть приложение, в котором есть фактоиды с тегами, использующими гем act_as_taggable. В настоящее время я настроил его так, что на индексной странице фактоидов нажатие на любой из тегов фильтрует фактоиды по этому тегу. Сейчас я пытаюсь создать индексную страницу со списком всех тегов в приложении. Это казалось довольно прямолинейным...

  1. создать tag.rb
  2. создать tags_controller.rb
  3. добавить представление в tags/index.html.erb

Проблема в том, что это приводит к тому, что мой ранее реализованный поиск ломается. Если есть какие-либо дополнительные вещи, которые необходимы, пожалуйста, дайте мне знать.

FactoidsController (индексная его часть)

class FactoidsController < ApplicationController
  helper_method :sort_column, :sort_direction
  before_filter :authenticate_user!

  # GET /factoids
  # GET /factoids.json
  def index
    if params[:tag]
      @factoids = Factoid.tagged_with(params[:tag]).order(sort_column + ' ' + sort_direction).paginate(:per_page => 15, :page => params[:page])
    else
      @factoids = Factoid.search(params[:search]).order(sort_column + ' ' + sort_direction).paginate(:per_page => 15, :page => params[:page])
    end

    respond_to do |format|
      format.html # index.html.erb
      format.json { render json: @factoids }
    end
  end

  def tagged
    if params[:tag].present?
      @factoids = Factoid.tagged_with(params[:tag])
    else
      @factoids = Factoid.postall
    end
  end

  private
  def sort_column
    params[:sort] || "created_at"
  end

  def sort_direction
    params[:direction] || "desc"
  end

end

Контроллер тегов

class TagsController < ApplicationController
  helper_method :sort_column, :sort_direction
  before_filter :authenticate_user!

  # GET /factoids
  # GET /factoids.json
  def index
    @tags = Tag.all

    respond_to do |format|
      format.html # index.html.erb
      format.json { render json: @tags }
    end
  end

  private
  def sort_column
    params[:sort] || "created_at"
  end

  def sort_direction
    params[:direction] || "desc"
  end

end

Маршруты

QaApp::Application.routes.draw do
  devise_for :users

  resources :factoids

  resources :tags

  get "home/index"

  match 'tagged' => 'factoids#tagged', :as => 'tagged'

  get 'tags/:tag', to: 'factoids#index', as: :tag

  root :to => 'home#index'

end

person Zack    schedule 25.04.2014    source источник


Ответы (1)


Вам не нужно преодолевать все трудности создания модели тега и контроллера. `acts-as-taggable-on предоставляет метод для поиска списка всех тегов для модели.

2.0.0-p451 :008 > Factoid.tag_counts
  ActsAsTaggableOn::Tag Load (2.0ms)  SELECT tags.*, taggings.tags_count AS count FROM "tags" JOIN (SELECT taggings.tag_id, COUNT(taggings.tag_id) AS tags_count FROM "taggings" INNER JOIN factoids ON factoids.id = taggings.taggable_id WHERE (taggings.taggable_type = 'Factoid' AND taggings.context = 'tags') AND (taggings.taggable_id IN(SELECT factoids.id FROM "factoids")) GROUP BY taggings.tag_id HAVING COUNT(taggings.tag_id) > 0) AS taggings ON taggings.tag_id = tags.id
 => #<ActiveRecord::Relation [#<ActsAsTaggableOn::Tag id: 1, name: "tag">]>

Это вернет ActiveRecord::Relation всех объектов тегов. Вы можете запустить на нем карту, чтобы получить массив тегов

Factoid.tag_counts.map(&:name)
 => ["tag"]
person Zero Fiber    schedule 25.04.2014
comment
Что ж, это сэкономило мне ТОННУ работы. :-) Огромное спасибо! - person Zack; 25.04.2014