这是您如何使用
jQuery Tokeninput和
ActsAsTaggableOn的自动完成功能.
在我的情况下,我使用一个嵌套的形式,但它不应该.下面的一切都是代码.
码
产品型号:
attr_accessible :tag_list # i am using the regular :tag_list acts_as_taggable_on :tags # Tagging products
产品控制器
#1. Define the tags path #2. Searches ActsAsTaggable::Tag Model look for :name in the created table. #3. it finds the tags.json path and whats on my form. #4. it is detecting the attribute which is :name for your tags. def tags @tags = ActsAsTaggableOn::Tag.where("tags.name LIKE ?","%#{params[:q]}%") respond_to do |format| format.json { render :json => @tags.map{|t| {:id => t.name,:name => t.name }}} end end
路线:
# It has to find the tags.json or in my case /products/tags.json get "products/tags" => "products#tags",:as => :tags
application.js中:
$(function() { $("#product_tags").tokenInput("/products/tags.json",{ prePopulate: $("#product_tags").data("pre"),preventDuplicates: true,noResultsText: "No results,needs to be created.",animateDropdown: false }); });
形成:
<%= p.text_field :tag_list,:id => "product_tags","data-pre" => @product.tags.map(&:attributes).to_json %>
第1期(SOLVED)
必须有行:
format.json { render :json => @tags.collect{|t| {:id => t.name,:name => t.name }}}
注意 – 您也可以在这里使用@ tags.map,您也不必更改表单.
以下是为什么需要这样做的2个问题:
我有以下标签:{“id”:1,“name”:“Food”}.当我保存产品时,标记为“食物”,它应该保存为ID:1,当它搜索并找到名称“食物”.目前,它使用引用“食物”ID(即{“id”:19,“name”:“1”})的新ID保存新标签.相反,它应该找到ID,显示名称,并做一个find_or_create_by,因此它不会创建一个新的标签.
第2期(SOLVED)
当我通过<%= @ product.tag_list%> ;.去产品/展示看标签.名称显示为“标签:1”,当它真的应该是“标签:食物”. 如何解决这些问题?
解决方法
您应该在route.rb中定义一条路由,该路由应该处理产品/标签路径.你可以定义它:
get "products/tags" => "products#tags",:as => :tags
因此应该给你一个tag_path帮助程序,它应该评估到/ products / tags.这应该摆脱你在问题中提到的错误.在定义资源之前,请确保添加此路由:route.rb中的product
现在到了acts-as-taggable-on,我没有使用这个gem,但是你应该看看方法all_tag_counts documentation.你的ProductsController#tags方法将需要对以下几行进行一些更改.我不知道它是否需要什么,因为我使用Mongoid并且不能测试它.
def tags @tags = Product.all_tag_counts.(:conditions => ["#{ActsAsTaggableOn::Tag.table_name}.name LIKE ?","%#{params[:q]}%"]) respond_to do |format| format.json { render :json => @tags.collect{|t| {:id => t.name,:name => t.name } } end end