2011-05-01 83 views
1

我想在我的應用程序中使用railtie擴展特定模型。添加類方法是有效的,但實例方法也不行。我有以下代碼:擴展模型的實例方法

class Railtie 
    def self.insert 
     return unless defined?(::ActiveRecord) 
     ::MyApp::MyModel.extend(ModelMethods) 
    end 
    end 

    module ModelMethods 
    def hello 
     puts "hello" 
    end 
    end 

現在,我可以撥打MyModel.hello。但是,如果我想添加一些實例方法,該怎麼辦?當我嘗試通過::MyApp::MyModel.include(InstanceMethods)添加它們時,它會失敗,並顯示調用私有方法的內容。

回答

2

include是一種私人方法,不能有明確的接收方。你可以通過使用send來避開這個限制:

MyModel.send(:include, InstanceMethods) 
+0

thx,那有效! – 23tux 2011-05-01 16:46:00

+0

第二個問題:是否可以擴展命名範圍(Rails 3)而不是類方法?當我嘗試向模塊添加一個'scope:myscope,lambda ...'時,我當然會得到該模塊未定義的方法錯誤。我怎麼能這樣做,以便我可以將命名範圍添加到包含在MyModel中的模塊? – 23tux 2011-05-01 17:17:31

+0

我自己並沒有這樣做,但是您可以使用模塊回調,如Module.included:http://ruby-doc.org/core/classes/Module.html#M000458讓它調用範圍方法,當它被包含在你的課堂中時。不幸的是,這個評論框是有限的,所以我不能給你一個很好的例子。 – 2011-05-01 17:51:15