我有一个 RoR 应用程序,允许用户标记其集合中的项目。我使用 tag-it.js Jquery 插件并使用 Ajax 调用在 ItemsController 中添加和删除标签。我的问题是每个标签添加两次,因此当我执行 @item.tags.each 时,所有标签都会显示两次。
项目控制器:
def add_tag
@collection = current_user.collections.find(params[:collection_id])
@item = @collection.items.find(params[:id])
@item.tag_list.add(params[:tag])
current_user.tag(@item, :with => @item.tag_list.to_s, :on => :tags)
@item.save
render nothing: true
end
def remove_tag
@item = current_user.items.find_by_id(params[:id])
@item.tag_list.remove(params[:tag])
current_user.tag(@item, :with => @item.tag_list.to_s, :on => :tags)
@item.save
render nothing: true
end
使用 Tag-it.js 处理 AJAX 标记的 Javascript:
$('#item_tags').tagit({
onTagAdded: function(event, tag) {
var add_url = $('#item_tags').attr("data-add-url");
$.ajax({
url: add_url,
data: {tag: tag.text().substring(0, tag.text().length-1)},
})
},
onTagRemoved: function(event, tag) {
var remove_url = $('#item_tags').attr("data-remove-url");
$.ajax({
url: remove_url,
type: 'DELETE',
data: {tag: tag.text().substring(0, tag.text().length-1)},
})
},
tagSource: function(search, showChoices) {
var autocomplete_url = $('#item_tags').attr("data-auctocomplete-url");
$.ajax({
url: autocomplete_url,
data: {term: search.term},
success: function(choices) {
showChoices(choices);
}
})
}
});
item#_form 视图,用户在其中添加/删除标签:
<ul id='item_tags' class='tagit' data-remove-url="<%= remove_tag_collection_item_path %>" data-add-url="<%= add_tag_collection_item_path %>" data-auctocomplete-url="/collections/<%[email protected] /cdn-cgi/l/email-protection %>/items/autocomplete_tag_name">
<% @item.tags.each do |tag| %>
<li><%= tag.name %></li>
<% end %>
</ul>
我必须注意,有必要拥有标签所有权(由 current_user ),以便 Jquery 自动完成仅根据当前用户以前的标签而不是所有用户完成。我认为问题是我必须将标签添加到 tag_list,然后将 tag_list 添加到用户项标记。我找不到解决此问题的方法,因为当调用 current_user.tag() 时, current_user.tag() 方法似乎会覆盖以前的项目标签,因此我必须将新标签添加到以前的标签中以保留它们。
此外,当我提交 item#_form 时,我需要以某种方式让 update 方法忽略标签属性,因为它试图将它们保存到项目中,但它们已经通过 AJAX 调用保存,所以我收到此错误:
ActiveRecord::AssociationTypeMismatch in ItemsController#update
ActsAsTaggableOn::Tag(#82082080) expected, got String(#72294010)
提前致谢。
附言。以下是我如何在 ItemsController 中实现自动完成功能:
def get_autocomplete_items(parameters)
tags = current_user.owned_tags.named_like(parameters[:term])
end