2015-08-21 1 views
5

J'ai un modèle appelé Recette qui utilise la gemme acts-as-taggable-on pour ajouter des tags aux recettes. Le comportement bizarre est lorsque je modifie et met à jour la recette via le contrôleur, les marques de recette sont ajouté au lieu de mettre à jour les balises appropriées. Il y avait un Github issue similaire signalé mais personne ne répond. Ma version de gem acts-as-taggable-on est 3.2.6. Par exemple, ma recette a trois étiquettes: fruit, fruit et vegetables. La balise fruit n'est pas pertinente, j'ai donc retiré ces deux balises fruit dans mon champ de saisie f.tag_list pour inclure uniquement vegetables.Comportements étranges sur la gemme act-as-taggable-on de ne pas effacer les tags

Processing by Users::RecipesController#update as JS 
Parameters: {"utf8"=>"✓", "recipe"=>{"image_ids"=>"46746", "cover_image_id"=>"46746", 
"name"=>"Cauliflower", "description"=>"this is the description", "preparation_time_hr"=>"0", 
"preparation_time_min"=>"50", "servings"=>"4", 
"category_ids"=>"", "cuisine_ids"=>"", "tag_list"=>"vegetables", "ingredients"=>....} 

utilisateurs/recipes_controller.rb

def update 
    if @recipe.update_attributes(recipe_params) 
    if params[:publish_recipe] && params[:publish_recipe] == "true" 
     update_status!(:publish!) 
    end 
    redirect_to user_recipes_url 
    else 
    respond_to do |format| 
     format.html{ render "edit" } 
     format.js { render partial: "shared/flash_message", locals: { flash_type: "error", flash_message: "#{@recipe.errors.full_messages.to_sentence}" } } 
    end 
    end 
end 

Le recipe_params inclus tag_list comme paramètre autorisé.

def recipe_params 
    params.required(:recipe).permit(:name, :category_ids, :cuisine_ids, :tag_list, :preparation_time_hr, 
    :cover_image_id, :preparation_time_min, :servings, :description, :image_ids, :commentable, 
    ingredients_attributes: [:id, :name, :_destroy], 
    instructions_attributes: [:id, :text, :_destroy, image_attributes: [:id, :picture, :_destroy]] 
) rescue {} 
end 

mais a fini par les vieux ne sont pas supprimés marquages, et la nouvelle a été ajouté à la liste: fruit, fruit, vegetables, vegetables.

Une autre chose étrange est que lorsque j'essaie de voir la liste de balises de la recette, c'est un tableau vide. Essayé d'éditer le tag_list dans la console rails, il a ajouté un autre marquage, mais quand je fais r.reload le tag_list c'est encore un tableau vide. Maintenant, la relation entre la recette et les balises sont comme ceci:

r = Recipe.find(20980) 
[56] pry(main)> r.tag_list 
ActsAsTaggableOn::Tag Load (14.9ms) SELECT `tags`.* FROM `tags` INNER JOIN `taggings` ON `tags`.`id` = `taggings`.`tag_id` WHERE `taggings`.`taggable_id` = 20980 AND `taggings`.`taggable_type` = 'Recipe' AND (taggings.context = 'tags' AND taggings.tagger_id IS NULL) 
=> [] 
[57] pry(main)> r.tags 
=> [#<ActsAsTaggableOn::Tag id: 2, name: "fruit", taggings_count: 1138, tagger_id: nil, tagger_type: nil, created_at: "2015-07-25 15:47:20", updated_at: "2015-07-25 15:47:53">, 
#<ActsAsTaggableOn::Tag id: 2, name: "fruit", taggings_count: 1138, tagger_id: nil, tagger_type: nil, created_at: "2015-07-25 15:47:20", updated_at: "2015-07-25 15:47:53">, 
#<ActsAsTaggableOn::Tag id: 531, name: "vegetables", taggings_count: 21, tagger_id: nil, tagger_type: nil, created_at: "2015-07-25 15:56:15", updated_at: "2015-07-25 15:56:16">, 
#<ActsAsTaggableOn::Tag id: 531, name: "vegetables", taggings_count: 21, tagger_id: nil, tagger_type: nil, created_at: "2015-07-25 15:56:15", updated_at: "2015-07-25 15:56:16">, 
#<ActsAsTaggableOn::Tag id: 531, name: "vegetables", taggings_count: 21, tagger_id: nil, tagger_type: nil, created_at: "2015-07-25 15:56:15", updated_at: "2015-07-25 15:56:16">] 
[58] pry(main)> r.taggings 
    ActsAsTaggableOn::Tagging Load (35.8ms) SELECT `taggings`.* FROM `taggings` WHERE `taggings`.`taggable_id` = 20980 AND `taggings`.`taggable_type` = 'Recipe' 
=> [#<ActsAsTaggableOn::Tagging id: 20408, tag_id: 2, taggable_id: 20980, taggable_type: "Recipe", tagger_id: 200422, tagger_type: "User", context: "tags", created_at: "2015-08-21 03:56:13">, 
#<ActsAsTaggableOn::Tagging id: 20409, tag_id: 2, taggable_id: 20980, taggable_type: "Recipe", tagger_id: 200422, tagger_type: "User", context: "tags", created_at: "2015-08-21 03:56:14">, 
#<ActsAsTaggableOn::Tagging id: 20410, tag_id: 531, taggable_id: 20980, taggable_type: "Recipe", tagger_id: 200422, tagger_type: "User", context: "tags", created_at: "2015-08-21 04:01:36">, 
#<ActsAsTaggableOn::Tagging id: 20411, tag_id: 531, taggable_id: 20980, taggable_type: "Recipe", tagger_id: 200422, tagger_type: "User", context: "tags", created_at: "2015-08-21 04:47:38">, 
#<ActsAsTaggableOn::Tagging id: 20412, tag_id: 531, taggable_id: 20980, taggable_type: "Recipe", tagger_id: 200422, tagger_type: "User", context: "tags", created_at: "2015-08-21 04:53:38">] 

La requête de base de données tag_list est bizarre aussi, pourquoi la requête comprend ce taggings.tagger_id IS NULL?

Je suis encore nouveau à cette gemme, aucune idée sur la façon de mettre à jour les tags correctement en utilisant les méthodes de gemme? J'espère que je pourrais éviter de mettre à jour les tags en utilisant mon propre code pour éviter d'autres problèmes. Il est à noter que mon modèle de recette est versionné par paper_trail gem, j'espère que ce n'est pas lié à ce problème.

+0

Pouvez-vous publier votre 'recipe_params'? – Pavan

+0

@Pavan ajouté 'recipe_params' à la question, merci – nayiaw

Répondre

1

Puisqu'il n'y a aucune solution d'Internet, et j'emploie seulement ce taggable sur la recette, pour maintenant j'appelle manuellement une méthode pour re-mettre à jour les étiquettes après l'enregistrement de modèle. Je pense toujours qu'il existe de meilleures solutions à ce problème, je suis ouvert aux alternatives comme la meilleure réponse.

1

Je ne vois rien dans les docs act-as-taggable-on sur ce qui se passe lorsque le tags_list entre en paramètre dans la méthode update_attributes, mais dans votre cas, il semble que les balises soient ajoutées sans supprimer celles existantes. J'ai remarqué dans les documents que le liste_balise peut être affecté avec le = qui remplace les balises existantes:

Vous pouvez également ajouter et supprimer des balises par affectation directe. Notez que cela supprimera les tags existants, utilisez-le donc avec attention.

@user.tag_list = "awesome, slick, hefty" 
@user.save 

Ainsi, vous pouvez le faire dans votre méthode de mise à jour

def update 
    if @recipe.update_attributes(recipe_params) 
    @recipe.tag_list = recipe_params["tag_list"] 
    @recipe.save 
    ... 
    else 
    ... 
    end 
end 
+0

J'ai fait assigner à' tag_list' dans ma console pour tester ceci mais les taggings sont toujours ajoutés sans enlever les existants. Lorsque je recharge l'objet Recipe, le 'tag_list' est à nouveau vide. – nayiaw

+0

Avez-vous enregistré l'objet Recette après avoir attribué les tags? –

+0

oui j'ai enregistré, sans aucune erreur. L'étiquetage est ajouté. – nayiaw