我在初始化程序中使用以下行在/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- 启动加载.这样做的正确方法是什么?
我有一个Rails 4示例项目(博客),我创建了一个名为'request_timer'的简单中间件 config/initializers/request_timer.rb
#config/initializers/request_timer.rb
class RequestTimer
def initialize(app)
@app = app
end
def call(env)
start_time = Time.now
status, headers, response = @app.call(env)
stop_time = Time.now
[status, headers, response.body]
end
end
Run Code Online (Sandbox Code Playgroud)
我config/application.rb以两种方式添加了我的中间件
1)添加为常量
#config/application.rb
module Blog
class Application < Rails::Application
config.middleware.use RequestTimer
end
end
Run Code Online (Sandbox Code Playgroud)
这样当我尝试运行我的rails应用程序时,我收到了错误
/Users/sameera/workspace/ruby-rack/blog/config/application.rb:9:in `require': cannot load such file -- request_timer (LoadError)
from /Users/sameera/workspace/ruby-rack/blog/config/application.rb:9:in `<top (required)>'
from /Users/sameera/.rvm/gems/ruby-2.0.0-p247/gems/railties-4.0.2/lib/rails/commands.rb:74:in `require'
from /Users/sameera/.rvm/gems/ruby-2.0.0-p247/gems/railties-4.0.2/lib/rails/commands.rb:74:in `block in <top (required)>'
from /Users/sameera/.rvm/gems/ruby-2.0.0-p247/gems/railties-4.0.2/lib/rails/commands.rb:71:in `tap'
from /Users/sameera/.rvm/gems/ruby-2.0.0-p247/gems/railties-4.0.2/lib/rails/commands.rb:71:in `<top (required)>'
from bin/rails:4:in `require'
from bin/rails:4:in …Run Code Online (Sandbox Code Playgroud)