私は、ユーザーがコレクション内のアイテムにタグを付けることができるRoRアプリを持っています。tag-it.js Jqueryプラグインを使用し、Ajax呼び出しを使用してItemsControllerのタグを追加および削除します。私の問題は、各タグが2回追加されるため、@ item.tags.eachを実行すると、すべてのタグが2回表示されることです。
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
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>
Jqueryのオートコンプリートがすべてのユーザーではなく現在のユーザーの以前のタグに基づいてのみ完了するように、(current_userによる)タグの所有権が必要であることに注意する必要があります。問題は、タグをtag_listに追加してから、tag_listをユーザーアイテムのタグ付けに追加する必要があることだと思います。current_user.tag()が呼び出されたときにcurrent_user.tag()メソッドが前のアイテムタグを上書きしているように見えるため、これを回避する方法を見つけることができません。そのため、前のタグに新しいタグを追加して保存する必要があります。
さらに、item#_formを送信するとき、更新メソッドがタグ属性を無視するようにする必要があります。これは、タグをアイテムに保存しようとしているのに、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