Вызов супер из модульного метода - PullRequest
4 голосов
/ 19 сентября 2011

Я пытаюсь переопределить метод, расположенный в Gem в Ruby / Rails, и у меня возникают некоторые проблемы.

Моя цель - выполнить пользовательский код при вызове метода из Gem, но также для продолжения выполнения исходного кода.

Я попытался абстрагировать код в следующий скрипт:

module Foo
  class << self
    def foobar
      puts "foo"
    end
  end
end

module Foo
  class << self
    def foobar
      puts "bar"
      super
    end
  end
end


Foo.foobar

Выполнение этого скрипта дает мне эту ошибку:

in `foobar': super: no superclass method `foobar' for Foo:Module (NoMethodError)

Как мне написать метод переопределения, чтобы я мог вызывать super с повышением этого исключения?

PS: Переопределение прекрасно работает, если я удаляю super, но тогда оригинальный метод не вызывается иЯ этого не хочу.

Ответы [ 2 ]

12 голосов
/ 21 мая 2012

Вы можете делать то, что вы хотите, как это:

module Foo
  class << self
    alias_method :original_foobar, :foobar
    def foobar
      puts "bar"
      original_foobar
    end
  end
end
6 голосов
/ 19 сентября 2011

Вызов super ищет следующий метод в цепочке поиска метода.Ошибка точно говорит вам, что вы здесь делаете: в цепочке поиска метода есть foobar метод для Foo, поскольку он не наследуется ни от чего.Код, который вы показываете в своем примере, является просто переопределением модуля Foo, поэтому наличие первого Foo ничего не делает.

...