我正在使用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 %>
我相信这更接近,但仍在努力......
答案 0 :(得分:1)
您的代码中有许多错误:
link_to
来电实际上正在调用index
行动。search_by_tag
方法期待一个参数,它应该使用params
哈希来访问在Web请求中传递给它的参数。tagged_with
是由acts_as_taggable_on添加的类方法,而不是表格中的字段 - 因此您无法像{C>}那样在where
方法中使用它。最后,要获取所有标记名称:Photo.tag_counts_on(:tags_or_whatever_you_tagged_on).map(&:name)
查看the acts_as_taggable_on documentation,您会看到如何使用tag_counts_on
和tagged_with
的示例。
关于Rails的事情:http://guides.rubyonrails.org/ http://railsforzombies.org/和/或http://railscasts.com/