2013-08-16 8 views
5

Ich versuche, ein tokeninput jquery Feld in einem Formular in meiner App hinzufügen, den Benutzer Status-Updates posten kann. Ich möchte, dass Benutzer Arbeiten (ein separates Modell) an die Statusaktualisierung anhängen können. Ich verwende das Juwel "act_as_taggable_on" und meine Abfrage gibt an, dass der Kontext der Tags "funktioniert". Das Feld lädt jedoch keine Suchergebnisse.Wie jquery tokeninput in Rails benutzen?

Ich habe eigentlich ein zweites tokeninput Feld, das Benutzer-Tags an den Status-Update befestigen können, ähnlich wie diese Website Tags zu diesem Thema Ticket anhängen verwendet. Es funktioniert gut! Ich versuche, diese Funktionalität zu spiegeln, um den Kontext anzugeben, in dem das Arbeitsmodell gesucht wird, und ich kämpfe mit der Implementierung.

Irgendwelche Ideen? Ihre Zeit und Hilfe wäre sehr willkommen! Hier ist der relevante Code:

Post Modell

attr_accessible :content, :tag_list, :work_list 

acts_as_taggable_on :tags 
acts_as_taggable_on :works 

Beitrag Controller (aktualisiert)

def work_list 
query = params[:q] 
@work_list = ActsAsTaggableOn::Tag.includes(:taggings).where("taggings.context = 'works'").where("tags.name ILIKE ?", "%#{params[:q].downcase.to_s}%").all 
@work_list = @work_list.select { |v| v.name =~ /#{query}/i } 
    respond_to do |format| 
    format.json { render :json => @work_list.map{|w| {:id => w.name, :name => w.name }}} 
    end 
end 


def tags 
    query = params[:q] 
    if query[-1,1] == " " 
     query = query.gsub(" ", "") 
     ActsAsTaggableOn::Tag.find_or_create_by_name(query) 
    end 

    #Do the search in memory for better performance 

    @tags = ActsAsTaggableOn::Tag.all 
    @tags = @tags.select { |v| v.name =~ /#{query}/i } 
    respond_to do |format| 
     format.json{ render :json => @tags.map{|t| {:id => t.name, :name => t.name }}} 
    end 
    end 

Form

<%= f.text_field :tag_list, :id => "post_work_list", "data-pre" => @post.work_list.map(&:attributes).to_json %> 

Javascript

$ -> 
    $("#post_tags").tokenInput "/posts/tags.json", 
    prePopulate: $("#post_tags").data("pre") 
    preventDuplicates: true 
    noResultsText: "No results, press space key to create a new tag." 
    animateDropdown: false 

$ -> 
    $("#post_work_list").tokenInput "/posts/work_list.json", 
    prePopulate: $("#post_work_list").data("pre") 
    preventDuplicates: true 
    noResultsText: "No results" 
    animateDropdown: false 

Routen

get "posts/tags" => "posts#tags", :as => :tags 
get "posts/work_list" => "posts#work_list", :as => :work_list 

Dank!

EDIT: ich diese Frage aufgeräumt und der gesamte Code aktualisiert. Ich begann auch ein Gespräch auf enginhere.com, die auch einige andere Fehlerbehebungs von anderen Ingenieuren hat:

http://bit.ly/179kiqH

Fühlen Sie sich frei durch die Fortsetzung der Unterhaltung auf dem oben enginhere.com Gespräch zu helfen und dann die endgültige, offizielle Entsendung Antworte hier auf das Kopfgeld!

Danke nochmal!

Antwort

2

Wenn Sie acts_as_taggable_on Juwel verwenden ist es einfache Art und Weise als in Railscast.

Model (Post):

acts_as_taggable_on :works 

Ansicht (Form):

= f.text_field :work_list, "data-pre" => f.object.work_list.sort.collect {|t| {id: t, name: t } }.to_json 

JS:

$ -> 
    $("#post_work_list").tokenInput "/posts/works.json", 
    preventDuplicates: true, 
    animateDropdown: false 
+0

Danke für die Antwort! Ich kann diese Arbeit nicht bekommen, aber das hat mich denken: warum nicht nur die für die Arbeiten acts_as_taggable_on Juwel verwenden, wie ich für Tags verwenden bin? Ich habe den Code gespiegelt, den ich für Tags verwende, aber das Arbeitsfeld funktioniert immer noch nicht. Ich komme aber näher!Das Javascript lädt, aber ich bekomme einen 500 Fehler, wenn ich etwas in das Feld eintippe. Aktualisierte Frage. Irgendwelche Ideen? Vielen Dank!!! – winston

+1

Was ist mit Fehlerbeschreibung in der Serverprotokollkonsole? Fange Fehler in der #works-Methode. –

+0

loszulegen "/posts/works.json?q=op" Verarbeitung von Posts # als JSON Parameter funktioniert: { "q" => "op"} Nameerror (nicht initialisierte Konstante ActsAsTaggableOn :: Werk): Completed 500 Interner Server Fehler in 1ms app/controllers/posts_controller.rb: 28: in 'funktioniert ' – winston

2
+2

Beachten Sie, dass [Link-only-Antworten werden abgeraten] (http://meta.stackoverflow.com/tags/link-only-answers/info), SO Antworten sollten der Endpunkt einer Suche nach einer Lösung sein (im Vergleich zu einem weiteren Zwischenstopp von Referenzen, die im Laufe der Zeit zu veralten scheinen). Bitte beachten Sie, dass Sie hier eine eigenständige Zusammenfassung hinzufügen und den Link als Referenz beibehalten. – kleopatra