Rails 3:在发电机内“需要”

时间:2010-08-13 06:42:25

标签: ruby-on-rails-3 generator

我正在编写一个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)

有人知道一项工作吗?

1 个答案:

答案 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)