Tôi sử dụng dòng sau trong trình khởi tạo để tự động tải mã trong /lib
thư mục của mình trong quá trình phát triển:
cấu hình / khởi tạo / custom.rb:
RELOAD_LIBS = Dir[Rails.root + 'lib/**/*.rb'] if Rails.env.development?
(từ Rails 3 Quicktip: Tự động tải lại các thư mục lib trong chế độ phát triển )
Nó hoạt động rất tốt, nhưng nó quá kém hiệu quả để sử dụng trong sản xuất - Thay vì tải lib trên mỗi yêu cầu, tôi chỉ muốn tải chúng khi khởi động. Cùng một blog có một bài viết khác mô tả cách làm điều này:
cấu hình / ứng dụng.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/**/"]
Tuy nhiên, khi tôi chuyển sang điều đó, ngay cả khi đang phát triển, tôi nhận được NoMethodErrors khi cố gắng sử dụng các hàm lib.
Ví dụ về một trong các tệp lib của tôi:
lib / extend.rb:
Time.class_eval do
def self.milli_stamp
Time.now.strftime('%Y%m%d%H%M%S%L').to_i
end
end
Gọi Time.milli_stamp
sẽ ném NoMethodError
Tôi nhận ra những người khác đã trả lời các câu hỏi tương tự trên SO nhưng tất cả họ dường như đều giải quyết các quy ước đặt tên và các vấn đề khác mà tôi không phải lo lắng trước đây - Các lớp lib của tôi đã hoạt động để tải theo yêu cầu, tôi chỉ muốn thay đổi nó để tải mỗi lần khởi động . Cách đúng đắn để làm điều này là gì?