2013-02-26 4 views
1

Как можно форматировать теги с помощью act-as-taggable-on перед сохранением модели?Как я могу форматировать теги с помощью атрибутов act-as-taggable-on перед сохранением моей модели пользователя?

Я использую следующий камень в моем рубин на рельсы проекта

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 будет [«кошки», «собаки», «кролики»]

Однако u.interests останется массивом объектов тегов, связанных с баскетболом, гольф, футболом

Как я могу убедиться, что теги отформатированы до сохранения тегов?

ответ

1

По какой-то причине ваш before_save обратного вызова должен прийти до acts_as_taggable_on в вашей модели, а Дэйв указывает здесь: https://github.com/mbleigh/acts-as-taggable-on/issues/147

Я подтвердил, что это работает с рельсами (3.2) и акты-как-taggable-на (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