我有一個RoR應用程序,允許用戶標記他們的集合中的項目。我使用tag-it.js Jquery插件並使用Ajax調用來添加和刪除ItemsController中的標籤。我的問題是每個標籤都添加了兩次,這樣當我執行@ item.tags.each時,所有標籤都會顯示兩次。acts_as_taggable_on標籤添加兩次
上述ItemsController:
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
的Javascript處理該AJAX標籤與標籤-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>
我必須注意,有必要擁有標籤所有權(通過current_user),以便Jquery自動完成僅基於當前用戶的先前標記而不是所有用戶完成。我認爲問題在於我必須將標記添加到tag_list,然後將tag_list添加到用戶項標記。我無法找到解決方法,因爲當調用current_user.tag()時,current_user.tag()方法似乎覆蓋了以前的項目標記,所以我必須將新標記添加到以前的標記才能保留它們。
此外,當我提交物品#_form時,我需要以某種方式讓update方法忽略tags屬性,因爲它試圖將它們保存到該項目,但它們已經保存在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
嗯...當我接着說:profile.tag_list.add( 「鮑勃」)'我的控制器代碼,因爲你有我的問題開始。我認爲這條線是不必要的。沒有它,我只能得到一個標籤。有了它,我得到了重複。 – Ziggy