2011-01-07 95 views
3

说我有一些不属于模型,控制器等的自定义类,我应该把它放在/ lib中是否正确?Rails加载路径问题

In rails < 3我将这个目录添加到我的加载路径中,并在rails 3+中,我将它添加到我的autoload_path中。它是否正确?

现在说我有一些类已经扩展了已定义的类。我应该在哪里把它放在启动时运行。例如说我想在String上添加方法'foo'。

 
class String 
    def foo 
    'foo; 
    end 
end 

我应该在哪里放这个类,使其在启动时定义?

我有另一个奇怪的错误是当我尝试命名空间在lib中的类。

 
module MyProject 
class Foo 
end 
end 

现在在一个控制台:

 
ruby-1.9.2-p136 :004 > MyProject::Foo 
LoadError: Expected /Users/me/workspace/my_project/lib/foo.rb to define Foo 
from /Users/rob/.rvm/gems/ruby-1.9.2-p136/gems/activesupport-3.0.3/lib/active_support/dependencies.rb:492:in `load_missing_constant' 
from /Users/rob/.rvm/gems/ruby-1.9.2-p136/gems/activesupport-3.0.3/lib/active_support/dependencies.rb:183:in `block in const_missing' 

我不断收到此错误。我怎样才能加载这个文件?

回答

3

可以一般把任何你想要的类文件,例如,你可以把他们在app /他人和目录添加到您的LOAD_PATH在梁2或autoload_path对Rails 3

要延长已定义的类你可能会想把这些文件放在config/initializers目录下。

要解决您提到的错误,您应该在foo.rb文件中定义Foo类,并确保模块名称匹配(Bags和MyProject)。

名称更改为自动加载的原因是the classes in autoload_paths are actually getting autoloaded, not simply loaded。这是Ruby中使用'autoload'和'require'的区别。

+0

手袋实际上是一个错字。仍然收到该错误。有没有其他地方可以把我想要的自动加载文件像初始化程序?不知道为什么Rails3只在自定义的时候自动加载,如果这个常量没有被定义 – HelpMe

+0

除了autoload_paths,你还可以使用autoload_once_paths来定义在启动Rails时只加载一次的目录。确保在测试之间完全重新启动控制台或Rails应用程序 - 即使在开发中,即使在开发过程中,初始化程序和autoload_only_once路径也只能加载一次。 –

+0

令人困惑的事情是,“自动加载”不会真正自动加载任何东西。它只是添加到类路径中。一切在配置/初始化器实际上自动加载..即在启动时运行 – HelpMe

8

在Rails 3,自动加载路径在config/application.rb中

#config.autoload_paths += %W(#{config.root}/extras) 

你,如果你想从lib目录加载代码取消注释此行禁止。