我在初始化程序中使用以下行在/lib开发期间在我的目录中自动加载代码:
配置/初始化/ custom.rb:
RELOAD_LIBS = Dir[Rails.root + 'lib/**/*.rb'] if Rails.env.development?
Run Code Online (Sandbox Code Playgroud)
(来自Rails 3 Quicktip:在开发模式下自动重新加载lib文件夹)
它运行良好,但在生产中使用效率太低 - 而不是在每个请求上加载库,我只想在启动时加载它们.同一篇博客还有另一篇文章描述了如何做到这一点:
配置/ application.rb中:
# Custom directories with classes and modules you want to be autoloadable.
config.autoload_paths += %W(#{config.root}/lib)
config.autoload_paths += Dir["#{config.root}/lib/**/"]
Run Code Online (Sandbox Code Playgroud)
但是,当我切换到它时,即使在开发中,我在尝试使用lib函数时也会得到NoMethodErrors.
我的一个lib文件的示例:
LIB/extensions.rb中:
Time.class_eval do
def self.milli_stamp
Time.now.strftime('%Y%m%d%H%M%S%L').to_i
end
end
Run Code Online (Sandbox Code Playgroud)
调用Time.milli_stamp将抛出NoMethodError
我意识到其他人已经在SO上回答了类似的问题,但他们似乎都在处理命名约定和其他我之前不必担心的问题 - 我的lib类已经为每个请求加载工作了,我只是想改变它到per- 启动加载.这样做的正确方法是什么?
我正在为open_flash_chart插件编写自定义包装器.它被放入/lib并作为模块加载ApplicationController.
但是,我有一些类层次结构或smth问题.
从任何控制器我可以访问open_flash_chart的功能OpenFlashChart,Line等等
但是,在/lib模块中的类中,它不起作用!
有任何想法吗?
我知道我做了一些愚蠢的事情或者没有做一些聪明的事情 - 我经常对两者都感到内疚.
这是一个让我痛苦的例子:
我有一个模块保存在/ lib中作为test_functions.rb,看起来像这样
module TestFunctions
def abc
puts 123
end
end
Run Code Online (Sandbox Code Playgroud)
进入ruby脚本/跑步者,我可以看到模块正在自动加载(良好的配置以及所有......)
>> TestFunctions.instance_methods
=> ["abc"]
Run Code Online (Sandbox Code Playgroud)
所以这个方法是已知的,让我们试试吧
>> TestFunctions.abc
NoMethodError: undefined method `abc' for TestFunctions:Module from (irb):3
Run Code Online (Sandbox Code Playgroud)
不.这个怎么样?
>> TestFunctions::abc
NoMethodError: undefined method `abc' for TestFunctions:Module from (irb):4
Run Code Online (Sandbox Code Playgroud)
再试一次.
defined?(TestFunctions::abc) #=> nil, but
TestFunctions.method_defined? :abc #=> true
Run Code Online (Sandbox Code Playgroud)
就像我在顶部说的那样,我知道我是愚蠢的,有人会让我失望吗?