2013-08-16 29 views
5

我想在我的應用程序中允許用戶發佈狀態更新的表單中添加一個tokeninput jquery字段。我希望用戶能夠將作品(單獨的模型)附加到狀態更新。我正在使用act_as_taggable_on gem,我的查詢指定了標籤上下文「works」。但是,該字段不會加載任何搜索結果。如何在Rails中使用jquery tokeninput?

我實際上有第二個令牌輸入字段,允許用戶將標籤附加到狀態更新,就像本網站使用標籤附加到此問題單。它工作正常!我試圖反映該功能來指定上下文來搜索工作模型,我正在努力實現。

任何想法?您的時間和援助將不勝感激!下面是相關代碼:

樁模型

attr_accessible :content, :tag_list, :work_list 

acts_as_taggable_on :tags 
acts_as_taggable_on :works 

柱控制器(更新)

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 

形式

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

路線

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

謝謝!

編輯:我清理了這個問題,並更新了所有的代碼。我也開始對enginhere.com交談其中也有來自其他工程師其他一些故障排除:

http://bit.ly/179kiqH

隨時通過繼續對上述enginhere.com談話的談話,然後發佈最終,官方幫助在這裏回答賞金!

再次感謝!

回答

2

如果您正在使用acts_as_taggable_on gem,那麼比railscast更容易。

模型(郵政):

acts_as_taggable_on :works 

視圖(形式):

= 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

感謝您的回覆!我無法得到這個工作,但這讓我想到:爲什麼不使用acts_as_taggable_on gem來處理像我用於標記的作品?我對我使用的代碼進行了鏡像,但工作區域仍然不起作用。儘管我正在接近!javascript加載但我在字段中輸入任何內容時遇到500錯誤。更新的問題。有任何想法嗎?謝謝!!! – winston

+1

在控制檯中的服務器日誌中的錯誤描述如何?在#works方法中捕獲錯誤。 –

+0

發起者GET 「/posts/works.json?q=op」 處理由PostsController#工作原理JSON 參數:{ 「Q」=> 「OP」} NameError(未初始化常數ActsAsTaggableOn ::工作): 500完成1ms內部服務器錯誤 app/controllers/posts_controller.rb:28:在'works'中 – winston

2
+2

請注意,[只提供鏈接的答案](http://meta.stackoverflow.com/tags/link-only-answers/info),所以SO答案應該是搜索解決方案的終點(而另一個參考文獻的中途停留時間往往會隨着時間推移而變得過時)。請考慮在此添加獨立的摘要,並將鏈接保留爲參考。 – kleopatra