ruby-on-rails
  • ruby
  • ruby-on-rails-3
  • twitter-bootstrap
  • 2012-03-20 10 views 6 likes 
    6

    jaki sposób zintegrować wpisywanie znaków z wyprzedzeniem od bootstrap tak:Korzystanie wpisywanie znaków z wyprzedzeniem z Twitter Bootstrap w formie (formtastic)

    <input type="text" class="span3" style="margin: 0 auto;" data-provide="typeahead" data-items="8" data-source='["University of Pennsylvania","Harvard","Yale","Princeton","Cornell","Brown","Columbia","Dartmouth"]'> 
    

    do standardowego formularza tak:

    <%= semantic_form_for(@education) do |f| %> 
    <%= render 'shared/error_messages', object: f.object %> 
    <div class="field"> 
    <%= f.input :college, placeholder: "Update Education" %> 
    </div> 
    <%= f.submit "Submit", class: "btn btn-large btn-primary" %> 
    <% end %> 
    
    +0

    nie przeczytałem całe swoje pytanie! Odpowiednio zaktualizowałem swoją odpowiedź. –

    Odpowiedz

    6

    W kontrolerze

    def index 
        @autocomplete_items = Model.all 
    end 
    

    W twoim widoku, tak jak masz z dodatkowym identyfikatorem dla selektora ...

    <% semantic_form_for(@education) do |f| %> 
        <%= render 'shared/error_messages', object: f.object %> 
        <div class="field"> 
        <%= f.input :college, placeholder: "Update Education", id: "auto_complete" %> 
        </div> 
        <%= f.submit "Submit", class: "btn btn-large btn-primary" %> 
    <% end %> 
    

    A co najważniejsze, przekazać zmienną @autocomplete_items instancji zdefiniowanej w kontrolerze do zmiennej JavaScript w widoku:

    <%= javascript_tag "var autocomplete_items = #{ @autocomplete_items.to_json };" %> 
    

    To szeregować swoje dane i uczynić ją użyteczną JSON dla funkcji wpisywanie znaków z wyprzedzeniem posługiwać się.

    chodzi o wpisywanie znaków z wyprzedzeniem, po prostu przekazać ten obiekt (@autocomplete_items) jako JSON do JavaScript tak:

    <script type="text/javascript"> 
        jQuery(document).ready(function() { 
         $('#auto_complete').typeahead({source: autocomplete_items}); 
        }); 
    </script> 
    

    Dodatkowo istnieje Autocomplete gem for Rails 3 które pracują bezpośrednio z modeli zamiast przechodząc od obiektu do twój JavaScript. W dokumentacji jest nawet przykład Formtastic.

    Edytuj: Wygląda na to, że nie przeczytałem całego twojego pytania! Niestety atrybuty danych HTML5 są obecnie nieobsługiwane w Formtastic. Istnieje jednak separate branch, który zawiera obsługę tych atrybutów.

    Poza tym zawsze tylko trzyma się good ol”Kopiuj/ERB dynamicznych funkcji, takich jak ten ...

    <input type="text" class="span3" style="margin: 0 auto;" data-provide="typeahead" data-items="8" data-source='<%= @autocomplete_items.to_json %>'> 
    

    EDIT 2: Właśnie zauważyłem dwie rzeczy. Po pierwsze jest sposób, w jaki przekazałem obiekt JSON do zmiennej JavaScript (patrz przykład). Po drugie, powyższy przykład wykorzystujący atrybuty danych HTML5 będzie nie współpracować z wtyczką Twittera typu Typeahead, ale będzie działać z wtyczką jQuery UI Autocomplete.

    +0

    Może dlatego, że jestem w tym trochę nowy, ale wydaje mi się, że nie mogę uzyskać ani napisanej przez ciebie metody, ani klejnotu Autocomplete. Jeśli chodzi o twoją metodę, gdzie mogę umieścić javascript? Zrobiłem model o nazwie University, który ma właśnie nazwy uniwersytetów, i stworzyłem kontroler o nazwie uniwersytety_controller i umieściłem w nim metodę indeksu. Wciąż jednak nie działa. Prosimy o pomoc? –

    +0

    Jaki jest błąd, który otrzymujesz? Czy problem dotyczy kodu Ruby lub JavaScript? –

    +1

    Po prostu zauważyłem, że sposób, w jaki przekazywałem kod JSON do kodu Javascript, byłby źródłem problemów.Poszedłem do przodu i naprawiłem to za pomocą pomocnika 'javascript_tag' i przekazałem zmienną za pomocą ERB. –

    2

    mam to działało jak:

    Controller

    @categories = Category.find(:all,:select=>'name').map(&:name) 
    

    i widoki

    <input type="text" class="span3" style="margin: 0 auto;" data-provide="typeahead" data-items="8" data-source='<%= @categories.to_json %>'> 
    
    +0

    Zamiast '@categories = Category.find (: all,: select => 'name'). Map (&: name)' możesz także zrobić krótszy '@categories = Category.uniq.pluck (: name)' . – rkallensee

    +0

    Będzie to działało dobrze w przypadku mniejszych zestawów danych, ale jeśli będą duże, czas potrzebny na przetworzenie wszystkich rekordów uniemożliwi szybkie działanie tego polecenia. W przypadku dużego zbioru danych należy użyć kwerendy zamiast zwracać cały json w porcji. –

    +0

    Zgadzam się na niski zbiór danych, będzie to szybkie. Dla dużych zestawów lepszym rozwiązaniem będzie korzystanie z ajax. Istnieje wiele przykładów ajax typeahead. – dbKooper

    Powiązane problemy