Так вы можете использовать автозаполнение с 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 (решено)
Должен иметь строку:
format.json { render :json => @tags.collect{|t| {:id => t.name, :name => t.name }}}
Примечание. Здесь также можно использовать @tags.map
, и вам не нужно менять форму.
Ниже приведены 2 вопроса о том, почему вам нужно было сделать это:
У меня есть следующее Tag
: {"id":1,"name":"Food"}
. Когда я сохраняю Product
, помеченный "Food"
, он должен сохранять как ID: 1
, когда он ищет и находит имя "Food"
. В настоящее время он сохраняет новый Tag
с новым идентификатором, который ссылается на "Food"
ID, т.е. {"id":19,"name":"1"}
. Вместо этого он должен найти идентификатор, показать имя и выполнить find_or_create_by
, чтобы не создавать новый Tag
.
Выпуск 2 (решено)
Когда я перехожу на products/show
, чтобы увидеть теги, набрав <%= @product.tag_list %>
. Название появляется как « Метки: 1 », когда оно действительно должно быть « Метки: Еда ».
Как я могу исправить эти проблемы?