Так вы используете автозаполнение с 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":19,"name":"1"}
. Вместо этого нужно найти идентификатор, показать имя и сделать find_or_create_by
, чтобы он не создавал новый Tag
.
Проблема 2 (РЕШЕННАЯ)
Когда я перейду к products/show
, чтобы увидеть теги, выполнив <%= @product.tag_list %>
. Имя появляется как " Тэги: 1", когда это действительно должно быть " Tags: Food".
Как я могу исправить эти проблемы?