Rails auto_complete标记搜索过滤器

时间:2009-12-15 23:02:02

标签: ruby-on-rails search autocomplete filter tags

尝试实现rails auto_complete插件,以帮助用户选择主页上没有显示的标签,因为可能会有数百个标签,只能显示一小部分标签。

我的导航工作方式如下:我从一个类别显示页面开始,该页面显示该类别中的所有文章。当用户点击标记时,会在网址中显示标记过滤器,如下所示:

http://localhost:3000/categories/Stories?tag=scary

这将显示故事类别中标记为“scary”的所有文章。

由于“可怕”不是一个流行的标签,它不会显示在主页上,但如果你将它放入自动填充文本字段,“scary”会显示出来。我希望提交标记呈现与上面相同的网址。

但我得到了一些不同的东西:

http://localhost:3000/categories/ShortStories?tag[name]=scary

不幸的是,这个过滤器不会返回任何东西,因为那个讨厌的[名字]潜入那里。

这是我自动完成的控制器代码:

 class CategoriesController < ApplicationController
 auto_complete_for :tag, :name 

视图

<% form_tag category_path, :method => 'get' do %>
<%= text_field_with_auto_complete :tag, :name, { :size => 15 } %>
<%= submit_tag "Search All Tags", :name => nil %>
<% end %>

:名称似乎是必需的,因为auto_complete需要指定一个列名,但是当我点击提交时我想把它从URL中取出来。有什么想法吗?

2 个答案:

答案 0 :(得分:2)

答案 1 :(得分:1)

经过一番搜索,我找到了我要找的东西。 This blog post让我走上正确的道路非常有帮助。

所以这就是我得到的:

在控制器中:

@search_tags = Tag.find_by_keyword(params[:tag])
    respond_to do |format|
        format.html
        format.js do
          render :inline => "<%= auto_complete_result(@search_tags, 'name') %>"
        end
     end

在视图中:

<div id="search">
  <% form_tag(category_path(), {:method => :get, :class => "form"}) do %>    
    <%= text_field_with_auto_complete :tag, :name, 
        { :name => "tag", :size => 20 },
        {:method => :get, :url => category_path(:format => :js) } %>
    <%=submit_tag "Search All Tags", :name => nil%>
  <% end -%>

最后,我在vendor / plugins / acts_as_taggable_on_steroids / lib

中为tag.rb模型添加了一个方法
  def self.find_by_keyword(keyword)
      if keyword.present?
        keyword = "%#{keyword}%"
        @search_tags = Tag.all :conditions => ["name like ?", keyword], :order => "name asc", :limit => 10
      else
        @search_tags = Tag.all :limit => 10, :order => "name asc"
      end
  end

它有效!