2010-11-01 33 views
15

Tôi có một ConstData lớp:Rails 3 autoload

class ConstData 

    US_CITIES = ['miami', 'new york'] 

    EUROPERN_CITIES = ['madrid', 'london'] 

end 

của nó được lưu trữ dưới /lib/const_data.rb

Ý tưởng là bên trong một mô hình, điều khiển hoặc xem tôi có thể làm:

ConstData::US_CITIES để nhận US_CITIES vv

Đường ray sẽ tự động tải lớp này, tôi nhận được từ: http://groups.google.com/group/rubyonrails-talk/browse_thread/thread/662abfd1df9b2612?hl=en

Tuy nhiên điều này không hoạt động. Bất cứ ai có thể giải thích cho tôi làm thế nào để thực hiện điều này?

Trả lời

48

Bài đăng @daniel đề cập đến là từ năm 2008. Rails đã thay đổi kể từ đó.
Thực tế, khá gần đây. Rails3 không tự động tải thư mục lib /.

Bạn có thể kích hoạt lại nó khá dễ dàng. Mở config/application.rb Và thêm, trong cấu hình (trong lớp Application) các followin:

config.autoload_paths += %W(#{config.root}/lib) 

Sau đó lib của bạn/dir sẽ được tự động nạp.

+0

Cảm ơn bạn thưa ngài, tôi sẽ chấp nhận nó trong 6 phút. Dù sao bạn cũng có thể cho tôi biết làm thế nào để kiểm tra những gì có trong đường dẫn autoload của bạn? – daniel

+2

<< YourApplication >> :: Application.config.autoload_paths –

+5

Cảnh báo!Nhiều loại mô-đun bạn có thể có trong/lib có thông tin cấu hình được đặt trong bộ khởi tạo và thông tin cấu hình sẽ bị xóa khi mô-đun được tải lại, gây ra lỗi không thể giải thích trong việc phát triển những thứ hoạt động tốt trong thử nghiệm và sản xuất. Giải pháp cho điều đó là thêm đường dẫn/lib vào config.autoload_once_paths thay vì config.autoload_paths. –

2

config.autoload_paths không hoạt động đối với tôi. Tôi giải quyết nó bằng cách đặt sau trong ApplicationController:

Dir["lib/**/*.rb"].each do |path| 
    require_dependency path 
end 
12

Các autoload_paths lý do không làm việc cho bạn và bạn buộc phải làm:

Dir["lib/**/*.rb"].each do |path| 
    require_dependency path 
end 

là vì bạn quên không gian tên lớp học của bạn .

lib/tuyệt vời/stuffs.rb nên chứa một lớp học/mô-đun như thế này:

class/module Awesome::Stuffs 
.... 

nhưng bạn có:

class/module Stuffs 
.... 

Rails có thể chỉ lớp autoload và các module có tên phù hợp với nó đường dẫn tệp và tên tệp.

:)

+0

Tốt. Điều này đã không đề cập trước đó và gây ra cho tôi rất nhiều vấn đề. Đối với đường dẫn tải để khớp nếu tôi có danh từ ghép nối làm tên mô-đun, tôi nên làm gì? (ví dụ: lib/monkey_man/engine.rb -> module MonkeyMan :: Engine?) Liệu nó có tự động caml case không? – Vivek

1

Thực hiện theo các giải pháp cho dir lib được tự động nạp:

Di config.threadsafe! từ development.rbproduction.rb;

Thêm vào config/application.rb:

config.autoload_paths += %W(#{config.root}/lib) 
config.threadsafe! 
config.dependency_loading = true 
+0

Cảm ơn bạn. Tôi đã thêm 'confing.threadsafe!' Trong một loạt các thay đổi để cố gắng để có được wicked_pdf để làm việc và đó là lý do tải tự động của tôi ngừng hoạt động. – TheRightChoyce