Рельсовая фильтрация с помощью act_as_taggable gem - PullRequest
2 голосов
/ 10 октября 2011

Я работаю над гемом Act-as-Taggable-On и у меня есть вопрос о том, как отфильтровать результаты поиска по тегам, выбранным пользователями. Вот сокращенный взгляд на мой контроллер:

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 не работает. Я могу видеть таблицу «тегов» созданного драгоценного камня и записи внутри него; я просто не совсем понимаю, как с этим обращаться, используя этот драгоценный камень)

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

UPDATE

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

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

фото / индекс

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

Я считаю, что это ближе, но все еще работает через это ...

1 Ответ

1 голос
/ 10 октября 2011

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

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

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

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

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

...