2010-01-21 4 views
6

He intentado destruir etiquetas del código dado pero no está funcionando. ¿Cómo se puede lograr?¿Cómo puedo eliminar la etiqueta de la lista de etiquetas del complemento act_as_taggable?

@tag = Tag.find_by_name(params[:name]) 
    @tag.destroy 
    render :update do |page| 
    page[:divtag].innerHTML = render :partial => "controls/tag_list" 
    end 
+0

¿Qué es este * * act_as_tagg plugin? ¿Podrías proporcionar más información al respecto? '@ tag.destroy' debería eliminar la etiqueta, por lo que algo más debe interferir. – Veger

+0

Heh tropezó accidentalmente con él: actúa como taggable-on Será mejor que cambie el título de la pregunta – Veger

+0

sí amigo, es el mismo plugin "actos-como-etiquetables", obtuve esto tomando el nombre de params y muestra un error como "nil no se puede forzar en Fixnum" –

Respuesta

13

El ejemplo que nos ha facilitado parece roto. Normalmente tiene una lista de etiquetas que pertenecen a un Modelo (digamos un modelo de Usuario). Posteriormente, se podría llamar algo como esto:

# Find a user 
@user = User.find_by_name("Bobby") 
# Show available tags 
@user.tag_list # => ["awesome", "slick", "hefty"] as TagList 
# Remove the "slick" tag 
@user.tag_list.remove("slick") 
# Store change 
@user.save 

Para más información mirar el acts-as-taggable-on readme (por desgracia, no se explica la eliminación de las etiquetas).

+2

Gracias, pero tengo los ans bu resolverlo de otra manera, @tag = Tag.find_by_name (params [: name]) @taggings = Etiquetado. find_all_by_tag_id (@ tag.id) para etiquetar en @taggings tagging.delete final @ tag.delete final final –

2

Si le interesa eliminar todas las etiquetas, puede enviar delete_all a la relación.

ejemplo corto

> resource.grades.delete_all 
> resource.reload 
> resource.grades 
=> [] 

ejemplo Largo

> resource.grades 
=> [#<ActsAsTaggableOn::Tag id: 336486, name: "Kindergarten", context: nil, sort: 0>, 
#<ActsAsTaggableOn::Tag id: 336506, name: "Pre-K", context: nil, sort: 0>] 
> resource.grades.delete_all 
    (0.3ms) BEGIN 
    SQL (0.5ms) DELETE FROM `taggings` WHERE `taggings`.`taggable_id` = 984643 AND `taggings`.`taggable_type` = 'Resource' AND `taggings`.`tag_id` IN (336486, 336506) AND (taggings.context = 'grades') 
    (0.2ms) COMMIT 
=> [#<ActsAsTaggableOn::Tag id: 336486, name: "Kindergarten", context: nil, sort: 0>, 
#<ActsAsTaggableOn::Tag id: 336506, name: "Pre-K", context: nil, sort: 0>] 
> resource.reload 
    Resource Load (0.6ms) SELECT `resources`.* FROM `resources` WHERE `resources`.`id` = 984643 LIMIT 1 
=> #<Resource id: ...> 
> resource.grades 
    ActsAsTaggableOn::Tag Load (0.6ms) SELECT `tags`.* FROM `tags` INNER JOIN `taggings` ON `tags`.`id` = `taggings`.`tag_id` WHERE `taggings`.`taggable_id` = 984643 AND `taggings`.`taggable_type` = 'Resource' AND (taggings.context = 'grades') 
=> [] 
3

ActsAsTaggableOn no tiene una buena manera de hacer esto construida en (que puedo encontrar). He aquí cómo lo hice:

Primero, encuentre las etiquetas que desea eliminar. Esto debería ser una Array o ActsAsTaggableOn::Tag::ActiveRecord_AssociationRelation

Si ha implementado acts_as_tagger:

tags = @user.owned_tags.where(name: my_array_of_tag_names)

Si usted quiere encontrar etiquetas por todos los propietarios (o no está utilizando acts_as_tagger):

tags = ActsAsTaggableOn::Tag.where(name: my_array_of_tag_names)

Luego recorre las etiquetas, encuentra todas las etiquetas y delete, y finalmente delete la etiqueta. (Tenga en cuenta que destroy no funcionará en este caso)

tags.each do |tag| 
    ActsAsTaggableOn::Tagging.where(tag_id: tag.id).delete_all 
    tag.delete 
end 
Cuestiones relacionadas