加载和包含模块的问题(开发与测试)

时间:2014-02-05 14:01:02

标签: ruby-on-rails module include require environment

我认为我理解在Ruby on Rails中要求和包含模块*的基础知识,但我无法弄清楚我遇到的问题是怎么回事。我正在使用Ruby 1.9.3和Rails 3.2.1。

我在/lib/_utils.rb中有一个名为Utils的模块,它当前只有一些日志记录功能。在应用程序的大多数其他文件中,我能够执行以下代码并使用记录器而没有任何问题:

logger = Utils::SingletonLogger.get_logger

请注意,在模型代码中,我通常使用实例变量而不是局部变量,这似乎也可以正常工作。

另请注意,这不需要我

include Utils
代码中的

问题是,在至少一个控制器中,我必须明确要求并包含模块才能工作。嗯,通常无论如何。大多数情况下,我得到一个NameError,因为它不会将Utils识别为常量。其他时候,它会抛出一个搜索错误。一旦它很长一段时间,它就会起作用。如果我只添加 include Utils 行,我会得到一个类似的NameError,但错误消息较短。

最重要的是,这只发生在测试环境中,而不是在我的本地开发实例中。

目前,我已经注释掉了这个文件中的所有日志记录,但我想了解发生了什么。我添加了

config.autoload_once_paths += %W(#{config.root}/lib)

到application.rb,认为这可以确保实际代码可用于应用程序中的任何文件。我想我应该需要

include Utils

在每个使用此模块的文件中,但我不明白为什么在其他文件中似乎不需要它,或者为什么我必须重新要求模块文件这个控制器。

我很感激任何见解或指导。

*简而言之 - require / load 将模块的实际源代码文件读入内存, include 使模块的方法在另一个文件中可用。我假设我真的只想在应用程序的每个实例上要求/加载一个文件 - 每次使用新类时执行该文件最多是不雅观的,最坏的情况下效率低。

2 个答案:

答案 0 :(得分:0)

我认为问题涉及以下几个方面的组合:

  • 模块的文件名与模块的名称不匹配,因此无法通过自动加载获取。
  • 我在几个文件中有一个明确的require语句,但没有其他文件。我认为当包含require的文件在没有的文件之前执行时,系统可以找到该模块,否则就不能。
  • 至少在故障排除期间,我有时会在类定义之外使用include语句,这显然最多是非标准的,在最坏的情况下毫无意义。
  • 我使用了模块名称作为前缀,当其他所有内容都设置正确时似乎可以正常工作,但可能在其他时候混淆了解释器。我认为这是直接调用模块方法的标准,这可能意味着你不必包含模块,虽然我还不确定。
  • 我有一个模型的初始化方法被覆盖,这可能没有导致这个问题,但确实抛出了干扰调试的异常。

我仍然不知道为什么这会在测试中消失,但不会在开发中消失​​。

答案 1 :(得分:0)

我使用Rails 3.2.11

请按照路径

用户▸[您的用户名]▸.rvm▸gems▸ruby-1.9.3-p545▸gems▸railties-3.2.11▸lib▸轨道▸引擎

访问文件:configuration.rb

替换

  

paths.add" lib",:load_path =>真

通过

  

paths.add" lib",:eager_load =>真

希望这有帮助!