我知道第一次提出这个问题已经有很长时间了,但是我想分享一个额外的答案。
我有另一位程序员几年来开发的几个Ruby应用程序,尽管它们可能访问相同的数据库,但它们在不同的应用程序中重用了相同的类。由于这违反了DRY规则,因此我决定创建一个类库,以供所有Ruby应用程序共享。我可以将其放在主要的Ruby库中,但这会在我不想做的通用代码库中隐藏自定义代码。
我遇到了一个问题,即我已经定义的名称“ profile.rb”与我使用的类之间存在名称冲突。直到我尝试创建通用代码库时,这个冲突才成为问题。通常,Ruby首先搜索应用程序位置,然后转到$ LOAD_PATH位置。
application_controller.rb找不到我创建的类,并且由于它不是类,因此在原始定义上引发了错误。由于我从应用程序的app / models部分中删除了类定义,因此Ruby在此处找不到它,并在Ruby路径中寻找它。
因此,我修改了$ LOAD_PATH变量,以包括我正在使用的库目录的路径。可以在初始化时在environment.rb文件中完成此操作。
即使将新目录添加到搜索路径中,Ruby也会抛出错误,因为它优先采用系统定义的文件。$ LOAD_PATH变量中的搜索路径优先优先搜索Ruby路径。
因此,我需要更改搜索顺序,以便Ruby在搜索内置库之前在我的公共库中找到该类。
这段代码是在environment.rb文件中完成的:
Rails::Initializer.run do |config|
* * * * *
path = []
path.concat($LOAD_PATH)
$LOAD_PATH.clear
$LOAD_PATH << 'C:\web\common\lib'
$LOAD_PATH << 'C:\web\common'
$LOAD_PATH.concat(path)
* * * * *
end
我认为您不能在此级别上使用之前提供的任何高级编码结构,但是如果您想在应用程序的初始化时进行设置,它就可以正常工作。当将$ LOAD_PATH变量添加回新变量时,必须保持其原始顺序,否则某些主要的Ruby类会丢失。
在application_controller.rb文件中,我只是使用一个
require 'profile'
require 'etc' #etc
这会为整个应用程序加载自定义库文件,即,我不必在每个控制器中都使用require命令。
对我来说,这就是我一直在寻找的解决方案,我想我会将其添加到此答案中以传递信息。
File.expand_path(File.dirname(__FILE__)).tap {|pwd| $LOAD_PATH.unshift(pwd) unless $LOAD_PATH.include?(pwd)}