我认为我理解在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 使模块的方法在另一个文件中可用。我假设我真的只想在应用程序的每个实例上要求/加载一个文件 - 每次使用新类时执行该文件最多是不雅观的,最坏的情况下效率低。
答案 0 :(得分:0)
我认为问题涉及以下几个方面的组合:
我仍然不知道为什么这会在测试中消失,但不会在开发中消失。
答案 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 =>真
希望这有帮助!