使用acts_as_taggable gem过滤Rails

时间:2011-10-09 21:12:48

标签: ruby-on-rails-3 acts-as-taggable-on

我正在使用act-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(&:name).each do |tag| %>
  <%= link_to tag, {:action => 'search_by_tag', :tag_name => tag}, :class => "tag" %>
<% end %>

我相信这更接近,但仍在努力......

1 个答案:

答案 0 :(得分:1)

您的代码中有许多错误:

  1. 您的link_to来电实际上正在调用index行动。
  2. 您的search_by_tag方法期待一个参数,它应该使用params哈希来访问在Web请求中传递给它的参数。
  3. tagged_with是由acts_as_taggable_on添加的类方法,而不是表格中的字段 - 因此您无法像{C>}那样在where方法中使用它。
  4. 最后,要获取所有标记名称:Photo.tag_counts_on(:tags_or_whatever_you_tagged_on).map(&:name)

    查看the acts_as_taggable_on documentation,您会看到如何使用tag_counts_ontagged_with的示例。

    关于Rails的事情:http://guides.rubyonrails.org/ http://railsforzombies.org/和/或http://railscasts.com/