我有一个 RoR 应用程序, 允许用户在收藏中标记项目 。 我使用标签 it. js Jquery 插件, 并使用 Ajax 调用来添加和删除项目管理员的标记。 我的问题是, 每个标签都添加了两次, 这样当我做时 @ 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
处理 AJAX 标签标签时使用 Tag- it. js 标签的 < 强度 > 正义标本: 强度>
$( #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);
}
})
}
});
用户添加/ 删除标签的 < 强度 > 项\\\ 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] %>/items/autocomplete_tag_name">
<% @item.tags.each do |tag| %>
<li><%= tag.name %></li>
<% end %>
</ul>
我必须指出的是,必须拥有标签所有权( 由当前用户(_user), 这样 Jquery 自动完成时只能根据当前用户先前的标签而不是所有用户来完成。 我认为问题在于我必须在标签列表中添加标签, 然后将标签列表添加到用户项目标签中。 我无法找到一个方法, 因为当前用户. tag () 的方法似乎在当前用户. tag () 被调用时覆盖了上一个项目标签, 因此我必须在先前的标签中添加新标签来保护它们 。
此外,当我提交项目时, 我需要某种方式让更新方法忽略标签属性, 因为它试图将标记属性保存到项目上, 但是它们已经用 AJAX 的电话被保存了, 所以我得到这个错误 :
ActiveRecord::AssociationTypeMismatch in ItemsController#update
ActsAsTaggableOn::Tag(#82082080) expected, got String(#72294010)
提前感谢。
PS,这就是我如何获得 自动完成的 设备管理员的工作方式:
def get_autocomplete_items(parameters)
tags = current_user.owned_tags.named_like(parameters[:term])
end