2016-02-10 5 views
3

Дано:Создание метод экземпляра недоступен из подкласса

class Base 
    def foo 
    puts 'foo!!!' 
    end 
end 

class Ball < Base 
end 

Я хочу:

  1. Ball.new.foo вернуть ошибку: No Method Found.
  2. Base.new.foo для возврата: foo!!!.

Мои попытки:

  • я мог сделать protected def foo, так что 1. Работы. Однако это не работает для 2.
  • Я мог бы сделать это точно так же, как это указано выше, чтобы 2. работал. Однако 1. не работает.

Любые идеи как сделать как 1., так и 2. работать?

предысторию проблемы

У меня есть ApplicationController действие def routing_error, который обрабатывает все остальные неопределенные маршруты. Проблема с этим - все остальные контроллеры, которые наследуют ApplicationController, также наследуют это действие, в котором я хотел, чтобы это не так. Я мог бы создать отдельный контроллер только с действием def routing_error, но я чувствую, что это слишком много, и сначала интересно, если есть другой способ решить эту проблему.

ответ

7

Do:

class Ball < Base 
    undef_method :foo 
end 

Если вы хотите указаного метод многих классов и вы не хотите, чтобы написать код, как выше для каждого из них, а затем создать класс между ними.

class Dummy < Base 
    undef_method :foo 
end 

class Base < Dummy 
end 

class Base2 < Dummy 
end 

... 
+0

Это решило мой вопрос. Тем не менее, что касается корня моей проблемы, мне понадобится поставить 'undef_method: foo' всем моим контроллерам. Может быть, я могу сделать это сейчас. Благодаря! –

+1

'ObjectSpace.each_object (класс) .select {| klass | Класс mudasobwa

+0

@mudasobwa, спасибо! это тоже поможет :) Мне просто нужно обязательно вызвать эту строку в конце всего кода приложения. –

Смежные вопросы