2012-11-27 67 views
0

我想扩展核心Array类有简单的方法:如何包含所有lib文件夹?

class Array 
    def to_hash 
    result = Hash.new 
    self.each { |a| result[a] = '' } 
    result 
    end 
end 

我把array.rb到LIB/core_ext并试图通过

config.autoload_paths += %W(#{config.root}/lib) 
config.autoload_paths += Dir["#{config.root}/lib/**/"] 

,要求它在application.rb中但仍获得undefined method 'to_hash' for ["var1", "var2", "var3"]:Array如果试图在模型方法中使用它。代码更改后,当然我重启了服务器。

回答

2

一旦这样,你可以做到这一点是通过添加以下的文件之一config/initializers

require 'core_ext/array` 

你所有的autoload_paths配置值的作用是使可当类/请求文件的路径。在我的应用我可能有一些文件结构如下

- lib/ 
    | 
    |- deefour.rb 
    |- deefour/ 
    | 
    |- core_ext.rb 

在我deefour.rb我有

require 'deefour/core_ext' 

和内部config/initializers我有一个deefour.rb文件,其中包含只是

require 'deefour' 

的唯一途径你设置的自动载入配置值将导致Rails看起来自动加载lib/deefour/core_ext.rb是,如果你有一些调用clas存在于该文件中的s Deefour::CoreExt。这就是为什么我的require 'deefour'行初始化程序知道自动加载lib/deefour.rb文件。

lib/deefour.rb中的明确require 'deefour/core_ext'用于相同的目的,因为它也不遵循Ruby/Rails所期望的标准类名到目录的映射。

+0

在初始值设定项中创建一个带有require的特殊文件是否正确? – freemanoid

+0

是的,当你试图从'lib /'中加载一个不符合典型的类名到目录映射的文件时,这是正确的。Ruby/Rails将会预期 – deefour

+0

你可以根据标准类名显示正确的变体目录约定? – freemanoid

相关问题