7

アプリで所有者タグを一意に使用したいと考えています。私の問題は、フォームを介して投稿を作成/更新すると、投稿f.text_field :tag_listのタグを更新するだけで所有者がいないことです。私が使用するf.text_field :all_tags_listと、作成/更新時の属性がわかりません。コントローラーに追加できます:

User.find(:first).tag( @post, :with => params[:post][:tag_list], :on => :tags )

しかし、投稿用と所有者用のタグが重複しています。所有者タグだけを操作するにはどうすればよいですか?

4

7 に答える 7

4

https://github.com/mbleigh/acts-as-taggable-on/issues/111でcustomersure(SOのtsdbrown)によって提案された回答は私のために機能します

# In a taggable model:
before_save :set_tag_owner
def set_tag_owner
    # Set the owner of some tags based on the current tag_list
    set_owner_tag_list_on(account, :tags, self.tag_list)
    # Clear the list so we don't get duplicate taggings
    self.tag_list = nil
 end

# In the view:
<%= f.text_field :tag_list, :value => @obj.all_tags_list %>
于 2011-07-01T08:17:07.043 に答える
2

これを解決するためにオブザーバーを使用しました。何かのようなもの:

/app/models/tagging_observer.rb 内

class TaggingObserver < ActiveRecord::Observer
  observe ActsAsTaggableOn::Tagging

  def before_save(tagging)
    tagging.tagger = tagging.taggable.user if (tagging.taggable.respond_to?(:user) and tagging.tagger != tagging.taggable.user)
  end
end

application.rb でオブザーバーを宣言することを忘れないでください

config.active_record.observers = :tagging_observer
于 2011-09-13T08:09:34.503 に答える
1

パーティーに遅れましたが、guillaume06 のソリューションがうまく機能することがわかり、いくつかの機能を追加しました。

これにより何が可能になるか: タグ付けされたモデルとタグ所有者モデルの間の関係の名前によって、タグ所有者を指定できるようになります。

方法: モジュールを作成し、初期化時に lib にインクルードします ( require 'lib/path/to/tagger'):

  module Giga::Tagger
    extend ActiveSupport::Concern
    included do
      def self.tagger owner
        before_save :set_tag_owner
        def set_tag_owner
          self.tag_types.each do |tag|
            tag_type = tag.to_s
            # Set the owner of some tags based on the current tag_list
            set_owner_tag_list_on(owner, :"#{tag_type}", self.send(:"#{tag_type.chop}_list"))
            # Clear the list so we don't get duplicate taggings
            self.send(:"#{tag_type.chop}_list=",nil)
          end
        end

      end
    end
  end

使用方法:

  Given: A model, Post, that is taggable
         A model, User, that is the tag owner
         A post is owned by the user through a relationship called :owner
  Then add to Post.rb:
         include Tagger
         acts_as_taggable_on :skills, :interests, :tags
         tagger :owner
  Make sure Post.rb already has called acts_as_taggable_on, and that User.rb has acts_as_tagger
  Note: This supports multiple tag contexts, not just tags (eg skills, interests)..
于 2013-07-09T10:52:27.933 に答える
1

set_tag_owner before_save がうまくいきました。しかし、bcb が述べたように、更新時にタグが削除されないように条件 (tag_list_changed?) を追加する必要がありました。

def set_tag_owner
  if tag_list_changed?
    set_owner_tag_list_on(account, :tags, tag_list)
    self.tag_list = nil
  end
end
于 2014-07-29T14:59:18.337 に答える
1

所有権を扱う場合、タグ付け可能なモデルは少し異なるタグを取得します。所有権がなければ、次のようにタグを取得できます。

@photo.tag_list << 'a tag' # adds a tag to the existing list
@photo.tag_list = 'a tag' # sets 'a tag' to be the tag of the @post

ただし、これらの操作は両方とも create taggins、 whichtagger_idおよびtagger_typearenilです。

これらのフィールドを設定するには、次のメソッドを使用する必要があります。

@user.tag(@photo, on: :tags, with: 'a tag')

次の行を のcreate/updateアクションに追加するとしますPhotosController

@user.tag(@photo, on: :tags, with: params[:photo][:tag_list])

はすでに に含まれているtagger_id/_typeため、これにより 2 つのタグ付けが作成されます (1 つは あり、もう 1 つはなし) 。したがって、それを回避するには、ホワイトリストに登録しないでください。params[:photo][:tag_list]photo_params:tag_list

Rails 3 の場合 - から削除:tag_listattr_accessibleます。

Rails 4 の場合 - から削除:tag_listparams.require(:photo).permit(:tag_list)ます。

最後に、createアクションは次のようになります。

def create
  @photo = Photo.new(photo_params) # at this point @photo will not have any tags, because :tag_list is not whitelisted
  current_user.tag(@photo, on: :tags, with: params[:photo][:tag_list])

  if @photo.save
    redirect_to @photo
  else
    render :new
  end
end

tag_listまた、この方法でオブジェクトにタグを付ける場合、写真のタグを取得する通常の方法を使用できないことに注意してtaggingsくださいtagger_id IS NULL。代わりに使用する必要があります

@photo.tags_from(@user)

タグ付け可能なオブジェクトbelongs_toが 1 人のユーザーの場合は、 user も使用できますall_tags_list

于 2015-07-28T21:34:18.643 に答える
0

委任を使用してみてください:

class User < ActiveRecord::Base
  acts_as_taggable_on
end

class Post < ActiveRecord::Base
  delegate :tag_list, :tag_list=, :to => :user
end

したがって、投稿を保存すると、ユーザー オブジェクトにタグが直接設定されます。

于 2011-02-01T18:01:50.060 に答える