我有一个 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/<%=@collection.id %>/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 方法忽略 tags 属性,因为它试图将它们保存到 item 但它们已经通过 AJAX 调用保存,所以我收到此错误:
ActiveRecord::AssociationTypeMismatch in ItemsController#update
ActsAsTaggableOn::Tag(#82082080) expected, got String(#72294010)
提前致谢。
PS。以下是我如何在 ItemsController 中自动完成工作:
def get_autocomplete_items(parameters)
tags = current_user.owned_tags.named_like(parameters[:term])
end