2010-01-21 30 views
6

Tôi đã cố gắng hủy các thẻ khỏi mã đã cho nhưng nó không hoạt động. Làm thế nào nó có thể được thực hiện?Tôi làm cách nào để xóa thẻ khỏi danh sách thẻ của plugin 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

Plugin * act_as_tagg * này là gì? Bạn có thể cung cấp thêm một số thông tin về nó không. '@ tag.destroy' nên xóa thẻ, vì vậy một thứ khác phải can thiệp. – Veger

+0

Heh tình cờ tình cờ vào nó: hành động-như-taggable-on Bạn nên thay đổi tiêu đề của câu hỏi – Veger

+0

có bạn bè ,, nó giống như một "hành vi-như-taggable" plugin ,, tôi có điều này bằng cách tham số tên và nó hiển thị lỗi giống như "không thể bị ép buộc vào Fixnum" –

Trả lời

13

Ví dụ bạn cung cấp có vẻ bị hỏng. Thông thường bạn có một danh sách các thẻ thuộc về một Model (cho phép nói một mô hình User). Sau đó, bạn có thể gọi một cái gì đó như thế này:

# 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 

Để biết thêm thông tin, hãy xem acts-as-taggable-on readme (không may, việc xóa thẻ không được giải thích).

+2

Cảm ơn nhưng tôi đã giải quyết xong cách khác, @tag = Tag.find_by_name (params [: name]) @taggings = Gắn thẻ. find_all_by_tag_id (@ tag.id) để gắn thẻ trong @taggings gắn thẻ.delete kết thúc @ tag.delete kết thúc kết thúc –

2

Nếu bạn muốn xóa tất cả các thẻ, bạn có thể gửi delete_all cho mối quan hệ.

dụ ngắn

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

dụ dài

> 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 không có một cách tốt để làm điều này được xây dựng trong (mà tôi có thể tìm thấy). Dưới đây là cách tôi đã thực hiện:

Trước tiên, tìm các thẻ bạn muốn xóa. Đây phải là một Array hoặc ActsAsTaggableOn::Tag::ActiveRecord_AssociationRelation

Nếu bạn đã thực hiện acts_as_tagger:

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

Nếu bạn muốn tìm thẻ của tất cả các chủ sở hữu (hoặc không sử dụng acts_as_tagger):

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

Sau đó, bạn lặp qua các thẻ, tìm tất cả các thẻ và delete chúng và cuối cùng là delete thẻ. (Lưu ý rằng destroy sẽ không hoạt động trong trường hợp này)

tags.each do |tag| 
    ActsAsTaggableOn::Tagging.where(tag_id: tag.id).delete_all 
    tag.delete 
end 
Các vấn đề liên quan