Как заставить ActsAsTaggableOn::Tag наследовать методы от модели тегов

Я использую act-as-taggable-on 2.0.6 для тегирования в приложении Rails 3.0.9. Я успешно добавил поддерживаемые базой данных атрибуты в модель тегов, например, у каждого тега есть RSS-канал, поэтому я могу вызвать @post.tags.first.feed_url, чтобы получить URL-адрес Feedburner из моей базы данных.

Но хотя я могу добавлять атрибуты в модель тегов, похоже, я не могу добавлять методы экземпляра. Я создал метод экземпляра:

class Tag < ActiveRecord::Base
  ...
  def subscribable?
    !feed_url.blank?
  end
  ...
end

Но когда я звоню @post.tags.first.subscribable?, я получаю сообщение об ошибке:

NoMethodError: undefined method `subscribable?' for #<ActsAsTaggableOn::Tag:0x00000100d32290>

Есть ли способ указать объектам ActsAsTaggableOn::Tag наследовать методы модели от модели Tag?


person Steve Grossi    schedule 02.08.2012    source источник


Ответы (3)


Вам нужно добавить это /config/initializers/tag_monkey_patch.rb

class ActsAsTaggableOn::Tag
  def subscribable?
    !feed_url.blank?
  end
end
person Chap    schedule 26.06.2013

Мне интересно то же самое. Насколько я пробовал, это не работает для меня..

class Tag < ActsAsTaggableOn::Tag
   def total_count
     ...
   end
end

Когда я вызываю это в примере с грязной цепочкой, например так:

my_model.my_instance.tag_counts_on(:tags).first.total_count

я получаю

undefined method `total_count' for #<ActsAsTaggableOn::Tag id: 1, name: "first">
person Daniel    schedule 10.10.2012

Насколько я понимаю, вы не должны объявлять новую модель «Тег», подобную этой, но должны переопределять класс следующим образом:

class ActsAsTaggableOn::Tag
   def total_count
      ...
   end
end
person MichaelAP    schedule 22.01.2013
comment
Ваш ответ выглядел так, как будто он сработает, но когда я заменяю class Tag < ActiveRecord::Base на class ActsAsTaggableOn::Tag, я все равно получаю неопределенный метод для добавленных мной методов экземпляра, как указано выше. - person Steve Grossi; 26.01.2013
comment
Где вы переопределяете класс? Вы можете попробовать поместить его в свои инициализаторы, чтобы убедиться, что он применяется при запуске сервера. - person MichaelAP; 29.01.2013
comment
Мне нужна модель тега (и контроллер, представления и т. д.), чтобы пользователи могли редактировать тег, чтобы добавить атрибут feed_url, о котором я упоминал ранее. Именно в модели я заменил class Tag на class ActsAsTaggableOn::Tag или class ActsAsTaggableOn::Tag < ActiveRecord::Base, ни один из которых не позволял мне прикреплять методы экземпляра к объектам ActsAsTaggableOn::Tag. - person Steve Grossi; 08.02.2013
comment
Я не думаю, что ActsAsTaggable ищет класс в каталоге Models, поэтому вам лучше добавить его в инициализаторы, чтобы убедиться, что он применяется при запуске. - person MichaelAP; 22.02.2013