我正在编写一个Rails 3生成器,但事情变得有点复杂,所以我想提取一些代码将它放在一个单独的文件中。
所以我在生成器文件夹中创建了一个文件,在我的生成器文件中,我把它放在顶部:
require 'relative/path/to/my/code.rb'
但是当我启动生成器时,它告诉我它无法找到该文件。
activesupport-3.0.0.rc/lib/active_support/dependencies.rb:219:in `require': no such file to load -- relative/path/to/my/code.rb (LoadError)
有人知道一项工作吗?
答案 0 :(得分:2)
这取决于您使用的是哪个Ruby版本。
在1.8中,它应该像你一样工作。在1.9中,您应该使用require_relative
。
你最后也不应该添加'.rb',不建议这样做。
带有相对路径的简单'require'的危险在于,如果这个脚本本身是另一个脚本所需要的,那么该路径将相对于第一个被称为的脚本:
rootdir
- main.rb
- subdir1
- second.rb
- subdir11
- third.rb
如果调用main.rb,然后需要second.rb(使用'subdir1/second'
),然后您想要使用'subdir11/third.rb'
的third.rb,则无效。
您可能与第一个脚本(subdir1/subdir11/third.rb
)相关,但这不是一个好主意。
您可以使用__FILE__
然后将其设为绝对路径:
需要File.expand_path('../ subdir11 / third.rb', FILE )
(第一个..是进入包含文件的目录)或
需要File.dirname(文件)+'/ subdir11 / third.rb'
但最常见的做法是从rootdir引用它。
在gem中,您可以假设rootdir将在$LOAD_PATH
中(或者您可以自己添加)。
在Rails中,您可以使用require "#{RAILS_ROOT}/path"
(rails2)或
require Rails.root.join('path')
(rails3)