这就是您如何使用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
应用程序.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(已解决)
必须有以下行:
format.json { render :json => @tags.collect{|t| {:id => t.name, :name => t.name }}}
注意 - 您也可以@tags.map
在此处使用,也不必更改表格。
以下是关于您为什么需要这样做的两个问题:
我有以下内容Tag
:{"id":1,"name":"Food"}
。当我保存一个Product
, 标记"Food"
时,它应该保存为ID: 1
当它搜索并找到名称时"Food"
。目前,它Tag
使用引用该ID 的新 ID 保存一个新"Food"
ID,即{"id":19,"name":"1"}
. 相反,它应该找到 ID,显示名称,然后这样做find_or_create_by
,它不会创建新的Tag
.
问题 2(已解决)
当我products/show
通过做来查看标签时<%= @product.tag_list %>
。该名称显示为“标签:1 ”,而实际上应该是“标签:食物”。
我该如何解决这些问题?