J'ai une application RoR qui permet aux utilisateurs d'étiqueter des éléments dans leurs collections. J'utilise le plugin Jquery tag-it.js et j'utilise les appels Ajax pour ajouter et supprimer les balises dans ItemsController. Mon problème est que chaque tag est ajouté deux fois de sorte que lorsque je fais @ item.tags.each, tous les tags sont affichés deux fois.acts_as_taggable_on Tags ajoutés deux fois
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 qui gère l'AJAX marquage avec 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);
}
})
}
});
point vue # de _form où ajoute/supprime l'utilisateur tags:
<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>
Je dois noter qu'il est nécessaire d'avoir une propriété de balise (par current_user) pour que l'achèvement automatique de Jquery se termine uniquement en fonction des balises précédentes de l'utilisateur actuel et pas de tous les utilisateurs. Je pense que le problème est que je dois ajouter la balise à la tag_list, puis ajouter la tag_list au marquage des éléments utilisateur. Je ne peux pas trouver un moyen de contourner cela parce que la méthode current_user.tag() semble remplacer les balises d'élément précédent lorsque current_user.tag() est appelé, donc je dois ajouter la nouvelle balise aux balises précédentes pour les conserver. En outre, lorsque je soumets l'élément # _form, la méthode de mise à jour doit ignorer l'attribut tags car il tente de les enregistrer dans l'élément, mais ils sont déjà enregistrés avec un appel AJAX, ce qui me donne l'erreur suivante:
ActiveRecord::AssociationTypeMismatch in ItemsController#update
ActsAsTaggableOn::Tag(#82082080) expected, got String(#72294010)
Merci d'avance.
PS. Voici comment je suis arrivé l'auto travail complet dans le ItemsController:
def get_autocomplete_items(parameters)
tags = current_user.owned_tags.named_like(parameters[:term])
end
Hum ... mon problème a commencé quand j'ajouté 'profile.tag_list.add ("bob")' à mon code de contrôleur, que vous avez. Je pense que cette ligne est inutile. Sans cela, je reçois juste une étiquette. Avec cela, j'ai des doublons. – Ziggy