【问题标题】:Rails 3 : `require` within a generatorRails 3:生成器中的`require`
【发布时间】:2010-08-13 06:42:25
【问题描述】:

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

有人知道解决方法吗?

【问题讨论】:

    标签: ruby-on-rails-3 generator


    【解决方案1】:

    这取决于您使用的是哪个 Ruby 版本。

    在 1.8 中,它应该像你一样工作。在 1.9 中,您应该使用 require_relative

    您也不应该在末尾添加“.rb”,不建议这样做。

    带有相对路径的简单“要求”的危险在于,如果该脚本本身被另一个脚本所需要,那么该路径将相对于第一个调用的脚本:

    rootdir
      - main.rb
      - subdir1
        - second.rb
        - subdir11
          - third.rb
    

    如果 main.rb 被调用,然后 require second.rb (with 'subdir1/second'),然后你想 require third.rb 和 'subdir11/third.rb',就不行了。

    您可能与第一个脚本 (subdir1/subdir11/third.rb) 相关,但这不是一个好主意。 您可以使用__FILE__,然后将其设为绝对路径:

    需要 File.expand_path('../subdir11/third.rb', FILE)

    (第一个..是进入包含文件的目录)或

    需要 File.dirname(FILE) + '/subdir11/third.rb'

    但最常见的做法是从根目录中引用它。

    在 gem 中,您可以假设 rootdir 将位于 $LOAD_PATH 中(或者您可以自己添加)。

    在 Rails 中,您可以使用 require "#{RAILS_ROOT}/path" (rails2) 或

    require Rails.root.join('path') (rails3)

    【讨论】:

    • 为什么不推荐'.rb'?如果没有指定,require 方法无论如何都会尝试查找“.rb”文件,或“.so”或“.dll”。
    • 'recommended' 确实可能不是个好词。但这是常见的做法,我从未见过任何使用它的代码,除非同时存在共享库和同名的 ruby​​ 脚本。此外,它看起来很丑;)
    猜你喜欢
    • 2011-07-31
    • 2011-04-22
    • 1970-01-01
    • 2011-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-01
    相关资源
    最近更新 更多