Перечисление всех тегов для activ_as_taggable
У меня есть приложение, в котором есть фактоиды, в которых есть теги, использующие гем act_as_taggable. В настоящее время он настроен таким образом, что при переходе на страницу индекса для фактоидов нажатие на любой из тегов фильтрует фактоиды по этому тегу. То, что я сейчас пытаюсь сделать, - это создать индексную страницу со списком всех тегов в приложении. Это казалось довольно прямым...
- создать
tag.rb
- создать
tags_controller.rb
- добавить представление в
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
1 ответ
Вам не нужно проходить через все трудности создания модели тега и контроллера. `actions-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"]