2016-02-10 47 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

務必:

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(Class).select {| klass | klass mudasobwa

+0

@mudasobwa,謝謝!這也將有所幫助:)我只需要確保在所有應用程序代碼的末尾調用此行。 –

相關問題