2012-04-18 71 views
1

我正在编写我的第一个Rails gem,它向ActiveRecord添加了一个方法。我似乎无法找到一种简单的方法从我添加到ActiveRecord的方法中调用其他方法。我应该使用这种模式吗?访问Ruby模块中的其他方法

module MyModule 

    def self.included(base) 
    base.extend(ClassMethods) 
    end 

    module ClassMethods 

    def my_class_method 
     # This doesn't work 
     some_utility_method 
    end 

    end 

    def some_utility_method 
    # Do something useful 
    end 

end 

ActiveRecord::Base.send(:include, MyModule) 

回答

3

一旦你包括MyModuleActiveRecord::Base将有my_class_method方法(等价地,Class对象ActiveRecord::Base的实例方法),并some_utility_method作为实例方法。

所以,内部my_class_methodselfActiveRecord::Base,而不是类的一个实例;它没有some_utility_method为可用的方法

编辑: 如果你想有一个实用方法私有的模块,你可以做这样的:

module MyModule 

    def self.included(base) 
    base.extend(ClassMethods) 
    end 

    module ClassMethods 

    def my_class_method 
     # This doesn't work 
     MyModule::some_utility_method 
    end 

    end 

    def self.some_utility_method 
    # Do something useful 
    end 

end 

ActiveRecord::Base.send(:include, MyModule) 
+0

这就是我的想法。那么......如何从类方法中利用模块中的其他方法?我想将功能分解成更小的块,但只想将一个类方法公开给ActiveRecord。 – 2012-04-18 19:53:20

+0

@MattFordham - 啊,好的。编辑一个解决方案 - 这是怎么回事? – Chowlett 2012-04-18 20:34:43

+0

优秀,正是我需要的。谢谢! – 2012-04-18 20:43:03