#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:
В вашем коде есть несколько ошибок:
- Ваш
link_to
вызов фактически вызываетindex
действие. - Ваш
search_by_tag
метод ожидает аргумент, где он должен использоватьparams
хэш для доступа к параметрам, переданным ему в веб-запросе. 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».