【问题标题】:Why can't I require a file in the parent directory in ruby?为什么我不能在 ruby​​ 的父目录中要求一个文件?
【发布时间】:2011-10-08 20:51:04
【问题描述】:

请注意,我没有使用 Rails。我有一个像这样的目录结构:

foo/
bar/
base_classes/
base_classes.rb

base_classes.rb:

 Dir.glob(File.expand_path(File.join("base_classes/config/constants", "*.rb"))) { |file| require file}
 Dir.glob(File.expand_path(File.join("base_classes", "*.rb"))) { |file| require file}

当我在这个根目录时

>> require 'base_classes' #=> true
>> Card.load!
[stuff happens]

但是当我在 foo/ 并执行以下任一操作时:

>> require '../base_classes' #=> true
>> require File.expand_path("../base_classes.rb") #=> true
>> require File.expand_path("../base_classes") #=> true
>> Card.load!
>> NameError: uninitialized constant Card

【问题讨论】:

    标签: ruby require load-path


    【解决方案1】:

    require 基于被调用的文件,通常表示config.ru。您需要require_relative(基于当前文件)或绝对路径。

    【讨论】:

    • 不应该包含与 expand_path 工作吗?这会创建一个绝对路径。
    • 应该,但是... require_relative 产生了什么?
    【解决方案2】:

    这可能会起作用,具体取决于您使用的 ruby​​ 版本。
    Current directory removed from load path for ruby 1.9.2

    我怀疑你的问题是这一行:require '../base_classes' when in foo/.
    试试require_relative '../base_classes' 看看会发生什么。

    这是假设您正在使用 ruby​​ 1.9.2。如果没有,可能需要更深入地挖掘。您应该标记问题或在其中提及(或两者兼而有之,最好)您正在运行哪个版本的 ruby​​。

    【讨论】:

      【解决方案3】:

      所需要的只是使用一个点而不是两个点。

      基于给定的示例代码:

      require File.expand_path("./base_classes.rb")
      

      【讨论】:

        【解决方案4】:

        问题实际上在 base_classes.rb 内部,我需要以下文件:

        Dir.glob(File.join(File.dirname(__FILE__), 'base_classes/config/constants', "*.rb")) { |file| require file}
        Dir.glob(File.join(File.dirname(__FILE__), 'base_classes', "*.rb")){ |file| require file}
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-12-03
          • 2013-07-05
          • 2012-01-04
          • 2014-12-06
          • 2013-05-27
          相关资源
          最近更新 更多