1

モデルを保存する前に、acts-as-taggable-onを使用してタグをフォーマットするにはどうすればよいですか?

私はRubyonRailsプロジェクトで次の宝石を使用しています

gem 'acts-as-taggable-on', '~> 2.3.1'

ユーザーモデルにインタレストタグを追加しました。

user.rb

class User < ActiveRecord::Base
  acts_as_ordered_taggable_on :interests
  scope :by_join_date, order("created_at DESC")

  rolify
  # Include default devise modules. Others available are:
  # :token_authenticatable, :confirmable,
  # :lockable, :timeoutable and :omniauthable
  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :trackable, :validatable

  # Setup accessible (or protected) attributes for your model
  attr_accessible :name, :email, :password, :password_confirmation, :remember_me, :interest_list

  # this does not work
  before_save :clean_my_tags

  # this also does not work
  # before_validation :clean_my_tags

  def clean_my_tags
    if @interest_list
      # it appears that at this point, @interest_list is no longer a string, but an
      # array of strings corresponding to the tags
      @interest_list = @interest_list.map {|x| x.titleize}
    end
  end
end

最後のユーザーがすでにインタレストタグを持っているとします:バスケットボール、ゴルフ、サッカーインタレストを次のように変更した場合

u = User.last
u.interest_list = "cats, dogs, rabbits"
u.save

その場合、u.interest_listは["cats"、 "dogs"、"rabbits"]になります

ただし、u.interestsは、バスケットボール、ゴルフ、サッカーに関連付けられたタグオブジェクトの配列のままになります

タグを保存する前にタグがフォーマットされていることを確認するにはどうすればよいですか?

4

1 に答える 1

1

Dave がここで指摘しているように、何らかの理由でbefore_saveコールバックがモデルの前に来る必要があります: https://github.com/mbleigh/acts-as-taggable-on/issues/147acts_as_taggable_on

これが Rails (3.2) と act-as-taggable-on (2.3.3) で動作することを確認しました:

class User < ActiveRecord::Base

  before_save :clean_my_tags

  acts_as_ordered_taggable_on :interests

  def clean_my_tags
    if interest_list
      interest_list = interest_list.map {|x| x.titleize}
    end
  end
end
于 2013-02-26T17:09:41.470 に答える