2010-01-21 80 views
6

我試圖從給定的代碼中銷燬標籤,但它不起作用。如何完成?如何從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

這是什麼* act_as_tagg *插件?你能提供一些關於它的更多信息嗎? '@ tag.destroy'應該刪除標籤,所以其他的東西一定是干涉的。 – Veger 2010-01-21 14:32:38

+0

heh意外地偶然發現了它:act-as-taggable-on你最好改變問題的標題 – Veger 2010-01-21 20:09:08

+0

是的朋友,它是同一個「行爲標籤」插件,我通過參數名並顯示錯誤,如 「零不能強制進入Fixnum」 – 2010-01-21 21:02:28

回答

13

您提供的示例似乎已損壞。通常你有一個屬於一個模型的標籤列表(可以說是一個用戶模型)。然後,你可以調用這樣的事情:

# 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 

欲瞭解更多信息,看看acts-as-taggable-on readme(不幸的是,去除標籤不解釋)。

+2

謝謝,但我得到了解決它的其他方式, @tag = Tag.find_by_name(params [:name]) @taggings =標記。 find_all_by_tag_id(@ tag.id) 用於在@taggings中加標籤 tagging.delete end @ tag.delete end end – 2010-01-22 05:55:48

2

如果您有興趣刪除所有標籤,可以發送delete_all至關係。

簡短的例子

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

龍例如

> 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沒有一個很好的辦法做到這一點內置的(我能找到)。以下是我如何做到的:

首先,找到要刪除的標籤。這應該是一個ArrayActsAsTaggableOn::Tag::ActiveRecord_AssociationRelation

如果你已經實現acts_as_tagger

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

如果你想通過所有業主找到標籤(或不使用acts_as_tagger):

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

然後你遍歷標籤,找到所有的標籤和delete他們,然後最後delete標籤。 (請注意,destroy在這種情況下不起作用)

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