2010-01-21 9 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

+0

हेह गलती से उसमें ठोकर खाई: कार्य-जैसा-टैग करने योग्य-पर आप – Veger

+0

हां दोस्त के शीर्षक को बेहतर ढंग से बदल देंगे, यह वही एक "कार्य-जैसा-टैग करने योग्य" प्लगइन है, मुझे इसे पैरा नाम लेने के द्वारा मिला और यह तरह त्रुटि दिखाने –

उत्तर

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

धन्यवाद "शून्य Fixnum मजबूर नहीं किया जा सकता" लेकिन मैं ans बू यह दूसरी तरह सुलझाने, @tag = Tag.find_by_name (पैरामीटर [: नाम]) मिला @taggings = टैग। find_all_by_tag_id (@ tag.id) @taggings में टैगिंग tagging.delete अंत @ tag.delete अंत अंत के लिए –

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 इस में (है कि मैं पा सकते हैं) बनाया करने के लिए एक अच्छा तरीका नहीं है। यहां बताया गया है कि मैंने यह कैसे किया:

सबसे पहले, उन टैग को ढूंढें जिन्हें आप हटाना चाहते हैं। यह होना चाहिए एक Array या ActsAsTaggableOn::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 
संबंधित मुद्दे