Фильтр поиска тегов autoscomplete Rails - PullRequest
1 голос
/ 16 декабря 2009

Попытка реализовать плагин rails auto_complete, чтобы помочь пользователю выбрать теги, которые не отображаются на домашней странице, поскольку потенциально могут быть сотни тегов, и может отображаться только небольшая часть.

Моя навигация работает следующим образом: я начинаю со страницы показа категории, которая отображает все статьи в этой категории. Когда пользователь щелкает тег, это вызывает фильтр тегов в URL-адресе, например:

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

Здесь будут показаны все статьи в категории «Истории» с тегом «Страшно».

Поскольку «страшный» не является популярным тегом, он не будет отображаться на домашней странице, но если вы поместите его в текстовое поле автозаполнения, появится «страшный». Я хочу, чтобы тег submit отображал тот же URL, что и выше.

Но я получаю что-то немного другое:

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, когда я нажму на submit. Есть идеи?

Ответы [ 2 ]

2 голосов
/ 16 декабря 2009
1 голос
/ 18 декабря 2009

После некоторых поисков я нашел то, что искал. Этот пост в блоге был очень полезен, помогая мне выбрать правильный путь.

Так вот что я получил:

В контроллере:

@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 -%>

Наконец, я добавил метод к модели tag.rb в vendor / plugins / acts_as_taggable_on_steroids / lib

  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

И это работает!

...