Ошибка при перемещении acts_as_taggable во включенный модуль - PullRequest
3 голосов
/ 11 ноября 2009

Если я напишу это, все работает нормально:

class A < ActiveRecord::Base
acts_as_taggable
end

Но если я возьму acts_as_taggable и вставлю его в модуль, который включает класс A, я получу ошибку:

module B
  def self.included(base)
    base.class_eval do
      extend ClassMethods
      include InstanceMethods
    end
  end

  module ClassMethods
    acts_as_taggable
  end

  module InstanceMethods
  end
end

class A < ActiveRecord::Base
include B

Ошибка из кода выше:

undefined local variable or method `acts_as_taggable' for C::ClassMethods:Module

Неправильно ли вызывать acts_as_taggable из включенного модуля?

Должно ли оно быть в самом определении класса?

1 Ответ

5 голосов
/ 11 ноября 2009

Когда Ruby загружает файл, содержащий ваш модуль B и достигает строки acts_as_taggable, он попытается выполнить метод acts_as_taggable класса ClassMethods (который не существует, потому что на самом деле это метод класса ActiveRecord::Base).

Вы можете использовать метод included для вызова acts_as_taggable, когда ваш модуль включен. included передается класс, в который включен модуль, поэтому будет работать следующее:

module B
  def self.included(base)
    base.acts_as_taggable

    # ...
  end

  # ...
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...