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

Heh가 실수로 우연히 발견 : acts-as-taggable-on 질문의 제목을 변경하는 것이 더 편할 것입니다. – Veger

+0

예 친구, 그 같은 행위는 "taggable"행위로 간주됩니다. 과 같은 오류가 표시됩니다. "0을 Fixnum에 강제 적용 할 수 없습니다." –

답변

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) 태그로 태그 달기 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 
관련 문제