2010-12-20 10 views
7

Używam starego auto_complete plugin w połączeniu z klejnotem acts as taggable on, aby zasadniczo odtworzyć zachowanie tagowania samego Stack Overflow! Mniej więcej robię to, co jest opisane w tej rails cast. W przypadku tagów pojedynczych działa to świetnie. Jednak naprawdę chciałbym, aby to było tak, że za każdym razem, gdy użytkownik wprowadzi spację lub przecinek (podobnie jak w Stack Overflow), autouzupełnianie rozpocznie się od nowa. Wyobrażam sobie, że jest jakiś sposób, aby to zrobić za pomocą regex, ale nie jestem pewien, jak zastosować to zachowanie do text_field (wyobrażam sobie używanie JavaScript do "restartu" autouzupełniania, ale przyznaję, że jestem dość słaby ., jeśli chodzi o JavaScripcie to, co moim zdaniem wygląda.Tagi autouzupełniania szyn rozdzielone przecinkami za pomocą wyrażeń regularnych

<%= text_field_with_auto_complete :business, :tags, {}, { :url => formatted_businesses_path(:js), :method => :get, :with => "'search=' + element.value" } %> 

Moje kontroler jest bardzo prosta, po prostu oszczędność tagi dla danej działalności

Jeśli ktoś może wskazać mi w dobrym kierunku (Ponieważ nie jestem pewien, jak to zrobić) bardzo bym to docenił.

+0

Czy kiedykolwiek dotarłeś do rozwiązania? Muszę zrobić dokładnie to samo. – ardavis

+0

@ardivis: nawet jeśli dla ciebie jest trochę za późno, spójrz na opcję ': tokeny => [", "," "]'. 'control.js' oferuje" Tokenized incremental autocompletion "używający tego. – evnu

Odpowiedz

10

Wiem, że to jest stare, ale aby odtworzyć to zachowanie, użyłem rails3-jquery-autocomplete z acts-as-taggable-on. Działają bardzo ładnie i łatwo razem.

// Model 
class Foo < ActiveRecord::Base 
    acts_as_taggable_on :tags 
end 

// Controller 
class FoosController < ApplicationController 
    autocomplete :tag, :name, :class_name => 'ActsAsTaggableOn::Tag' 
    ... 
end 

// Routes 
resources :foos do 
    collection do 
    get :autocomplete_tag_name 
    end 
end 

//View 
<% form_for :foo do |form| %> 
    <%= form.label :tag_list, "Tags" %> 
    <%= form.autocomplete_field :tag_list, autocomplete_tag_name_foos_path, :"data-delimiter" => ', ' %> 
<% end %> 

Nadzieję, że pomaga komuś.

+0

Skąd pochodzą "notatki" na twojej ścieżce? Powinien być "foos", prawda? Możesz to zmienić w celu wyjaśnienia .. –

+0

Ominęło to, dzięki. Naprawiono – chrisgooley

+0

Twoje wskazówki na temat kodu pomogły mi, dzięki! – lesyk

1

Zajrzeję do opcji dlaPomocnik. Jeśli nie obsługuje tego, czego potrzebujesz, porzuciłbym to na korzyść czegoś, nad czym masz większą kontrolę. Moje doświadczenie z pomocnikami/wtyczkami jest takie, że oszczędzają one tylko czas, jeśli robisz dokładnie to, czego oczekują od ciebie. Jeśli potrzebujesz czegoś niestandardowego, będziesz odczuwać więcej bólu, próbując obejść je, niż są one warte.

Aby pozbyć się pomocnika text_field_with_auto_complete, spójrz na kod HTML i JS, które generuje na renderowanej stronie. Skopiuj i wklej, a następnie zmodyfikuj, aby zrobić to, czego potrzebujesz. Nadal możesz korzystać ze strony kontrolera wtyczki autouzupełniania.

JS będziemy chcieli podzielić ciąg na przecinkami będzie wyglądać mniej więcej tak:

var tags = $('#myTextInput').value(); 
var splitTags = tags.split(/\w*,\w*/); 

JS regexen są dość podobne do Ruby. To wyrażenie podzieli się na przecinki, jedząc dodatkowe spacje.

Powiązane problemy