2010-11-21 19 views
23

Tôi đang cố tải SDK Tokbox trong đường ray 3. Tôi đã đặt thư viện vào thư mục/lib của mình, vì vậy cấu trúc thư mục của tôi trông giống như sau:Thư viện Rails 3 không tải cho đến khi yêu cầu

/lib
    opentok.rb
   /OpenTok
        Exceptions.rb
        OpenTokSDK.rb
        Session.rb

Tôi đang tải tất cả các file trong thư mục/lib bằng cách sử dụng sau đây trong application.rb:

file
config.autoload_paths += %W(#{config.root}/lib) 
config.autoload_paths += Dir["#{config.root}/lib/**/"] 

khác tôi có trong/lib thư mục tự động tải chỉ tốt, nhưng thư viện này không tải cho đến khi tôi thêm một require 'OpenTok':

ruby-1.9.2-p0 > OpenTok 
NameError: uninitialized constant OpenTok 
ruby-1.9.2-p0 > OpenTok::OpenTokSDK 
NameError: uninitialized constant OpenTok 
ruby-1.9.2-p0 > require 'OpenTok' 
=> ["OpenTok"] 
ruby-1.9.2-p0 > OpenTok 
=> OpenTok 
ruby-1.9.2-p0 > OpenTok::OpenTokSDK 
=> OpenTok::OpenTokSDK 

Cách chính xác để tải thư viện trong Rails 3 là gì?

Trả lời

30

Trình tải tự động sẽ rắn trường hợp không đổi, vì vậy "OpenTok" sẽ làm cho trình tải tự động tìm "open_tok.rb", chứ không phải "opentok.rb". Hãy thử đổi tên lib/opentok.rb và nó sẽ hoạt động tốt.

71

Tự động tải hoạt động tốt miễn là lớp trong tệp của bạn là một lớp là chỉ được xác định trong tệp đó. Nó không hoạt động nếu bạn muốn mở lại một lớp hiện có (ban đầu được định nghĩa trong tiêu chuẩn Ruby, Rails, hoặc một thư viện khác) và tùy chỉnh nó theo một cách nào đó.

Ví dụ về vấn đề:

Dưới đây là một ví dụ về một tập tin trong thư mục lib/rằng sẽ không bao giờ được tự động nạp:

lib/active_record/base_extensions.rb:

ActiveRecord::Base # make sure ActiveRecord::Base is loaded 
module ActiveRecord::Base::Extensions 
    # some methods here 
end 

class ActiveRecord::Base 
    include ActiveRecord::Base::Extensions 
end 

Tập tin này mở lại ActiveRecord::Base và cho biết thêm một số phương pháp đến lớp đó.

Điều gì sẽ kích hoạt tệp này để được tải tự động? Không có gì! Tự động tải dựa trên các hằng số và hằng số ActiveRecord::Baseđã được được tải (từ đá quý activerecord).

Vì vậy, việc tham chiếu hằng số ActiveRecord::Base trong ứng dụng của bạn sẽ không làm cho tệp cụ thể này được tải tự động.

Cách giải quyết:

Đây là những gì tôi làm gì để đảm bảo rằng tất cả các file của Ruby của tôi dưới lib/ được yêu cầu:

Thêm một initializer mới có tên config/initializers/require_files_in_lib.rb với nội dung này:

Dir[Rails.root + 'lib/**/*.rb'].each do |file| 
    require file 
end 
+0

chung , bạn muốn sử dụng 'config.autoload_paths' trong Rails, để nó có thể tải/dỡ các tập tin đúng cách. – m33lky

+2

Tôi đồng ý, thường sẽ là một ý tưởng tốt hơn, nhưng không phải lúc nào cũng có thể, ví dụ nếu bạn có một tệp mở lại lớp * hiện có * thay vì xác định lớp * mới *. Bất kỳ đề xuất cho những gì để làm trong trường hợp đó? –

+0

@ m33lky Tôi đang cố tải các lớp trong thư mục lib và thư mục con của thư mục lib nhưng đường ray không thích nó. Rails không thích thư mục con và tải tự động. Tôi không thích công việc này xung quanh vì nó bỏ qua bộ đệm ẩn lớp nhưng tôi không có bất kỳ tùy chọn nào khác. Tôi đổ lỗi cho đường ray cho đường ray. – Vinnyq12

Các vấn đề liên quan