Фильтрация Rails с помощью acts_as_taggable gem

#ruby-on-rails-3 #acts-as-taggable-on

#ruby-on-rails-3 #действует как пометка

Вопрос:

Я работаю с acts-as-taggable-on gem, и у меня возник вопрос о том, как отфильтровывать результаты поиска на основе выбранных пользователями тегов. Вот краткий обзор моего контроллера:

 class PhotosController < ApplicationController
  def index
    @photos = Photo.where(["created_at > ? AND is_approved = ?", 1.months.ago, true])
    @tags = ["Animals", "Architecture", "Cars", "Flowers", "Food/Drink", "General", "Landscape", "Mountains", "Nature"]
  end

  def search_by_tag(tag)
    @photos = Photo.where('tagged_with LIKE ?', tag)
  end
end
  

Фотографии / индекс

 <% @tags.each do |tag| %>
  <%= link_to tag, {:search_by_tag => tag}, :class => "tag" %>
<% end %>
  

Здесь перечислены все теги из хэша, @tags определенного в index , но щелчок по ним на самом деле ничего не фильтрует. Вот посмотрите, что щелчок по одной из этих ссылок приводит к появлению в журнале:

 Started GET "/photos?search_by_tag=Animals" for 127.0.0.1 at Sun Oct 09 17:11:09 -0400 2011
Processing by PhotosController#index as HTML
Parameters: {"search_by_tag"=>"Animals"}
SQL (0.5ms)   SELECT name  FROM sqlite_master  WHERE type = 'table' AND NOT name = 'sqlite_sequence'
  

Результат, который я хочу получить, заключается в том, чтобы на странице отображались только фотографии, которые соответствуют tagged_with тому тегу, на который был нажат. Я не совсем понимаю, как этого добиться.

(Побочный вопрос: кажется, я не могу найти способ перечислить все теги из tags таблицы, которая генерируется в качестве тегируемой. Выполнение чего-то вроде Photo.tagged_with или Photo.tags не работает. Я могу видеть таблицу «теги», созданную драгоценным камнем, и записи внутри нее; я просто не совсем понимаю, как справиться с этим, используя этот драгоценный камень)

Любые мысли с благодарностью.

Обновить

Я обновил свой код и стал немного ближе.

 class PhotosController < ApplicationController
  def search_by_tag
    @photos = Photo.tagged_with(params[:tag_name])
  end
  

фотографии / индекс

 <% Photo.tag_counts_on(:tags).map(amp;:name).each do |tag| %>
  <%= link_to tag, {:action => 'search_by_tag', :tag_name => tag}, :class => "tag" %>
<% end %>
  

Я считаю, что это ближе, но все еще работаю над этим…

Ответ №1:

В вашем коде есть несколько ошибок:

  1. Ваш link_to вызов фактически вызывает index действие.
  2. Ваш search_by_tag метод ожидает аргумент, где он должен использовать params хэш для доступа к параметрам, переданным ему в веб-запросе.
  3. tagged_with это метод класса, добавленный acts_as_taggable_on, а не поле в вашей таблице — поэтому вы не можете использовать его в where методе, как вы это сделали.

Наконец, чтобы получить все имена тегов: Photo.tag_counts_on(:tags_or_whatever_you_tagged_on).map(amp;:name)

Взгляните на документацию acts_as_taggable_on, и вы увидите примеры того, как использовать tag_counts_on и tagged_with .

Что касается Rails вещей:http://guides.rubyonrails.org / http://railsforzombies.org / и / илиhttp://railscasts.com /

Комментарии:

1. Спасибо за помощь, Джейсон. Не могли бы вы просмотреть обновление выше? Я чувствую, что я ближе, но все еще не там.

2. Что вы получаете сейчас? Ошибка об отсутствии сопоставления маршрутов? Вам нужен маршрут там, взгляните на документ о маршрутах . Но лучше посмотрите на документы по началу работы .

3. Я все еще работаю над этим, но, отвечая на ваш вопрос, ошибка, которую он выдает мне, — «Не удалось найти фотографию с ID = search_by_tag».