2010-01-18 26 views
7

我有一个Rails应用程序,它从一些Java服务中加载大量数据。我正在编写一个模块,它允许我用这些数据填充一些选择框,并且我正在试图正确地包含这些框,以便在我的视图中引用它们。这里是我的模块作为方法集合的红宝石模块

module FilterOptions 
    module Select 

    def some_select 
    return "some information" 
    end 
    end 
end 

我的想法是包括在我的application_helper FilterOptions,我想那我可以用Select::some_select这是不是这样引用我的方法。我必须include FilterOptions::Select然后我可以自己参考方法some_select。我不希望这样,因为我认为有人可能不知道some_select来自我自己的模块有点令人困惑。

所以,我怎么写的就像是公开的静态方法,模块的方法,所以我可以有我的主要模块,并使用子模块的命名空间一样Select::some_select

回答

11

引用我的方法,如果你定义内模块方法模块本身的背景下,它们可以被称为无进口:

module FilterOptions 
    module Select 
    def self.some_select 
    return "some information" 
    end 
    end 
end 

puts FilterOptions::Select.some_select 
# => "some information" 

也可以导入一个模块,而不是导入下,按名称引用它来代替:

include FilterOptions 
puts Select.some_select 
# => "some information" 
+0

好,我觉得挺傻的,我这样做在类的所有与自我的时候,我不知道为什么,我想到了一个模块会有所不同。顺便说一下,使用Select :: some_select和Select.some_select有什么区别? – brad 2010-01-18 15:34:51

+0

这是一个很好的问题。说到常量,你需要使用::符号,因为它不是方法调用,但我认为你可以使用任何方法。 – tadman 2010-01-18 17:38:40

12

module_function导致模块的功能可以被调用无论是作为一个实例方法或模块的功能:

#!/usr/bin/ruby1.8 

module Foo 

    def foo 
    puts "foo" 
    end 
    module_function :foo 

end 

Foo.foo  # => foo 
Foo::foo  # => foo 

include Foo 
foo   # => foo 

有时你想有一个模块是在每一个方法“模块功能”,但它可能会很麻烦并重复不断地说“module_function”。在这种情况下,只要有你的模块扩展本身:

!/usr/bin/ruby1.8 

module Foo 

    extend self 

    def foo 
    puts "foo" 
    end 

end 

Foo.foo  # => foo 
Foo::foo  # => foo 

include Foo 
foo   # => foo 
+0

对于迟到的回复感到抱歉,感谢您的详细信息,我现在只是学习元编程,所以我会将其添加到我的工具箱中! – brad 2010-02-12 16:50:07

+0

不客气。快乐的黑客! – 2010-02-12 17:59:37