Sự kỳ diệu của công cụ tự động tải
Tôi nghĩ rằng tùy chọn kiểm soát các thư mục mà công cụ tự động tải được thực hiện đã được bao phủ đầy đủ trong các câu trả lời khác. Tuy nhiên, trong trường hợp người khác gặp sự cố tải nội dung mặc dù họ đã sửa đổi đường dẫn tự động tải theo yêu cầu, thì câu trả lời này cố gắng giải thích điều kỳ diệu đằng sau thứ tự động tải này.
Vì vậy, khi nói đến việc tải nội dung từ các thư mục con, có một hình ảnh xác thực hoặc quy ước bạn nên biết. Đôi khi phép thuật Ruby / Rails (lần này chủ yếu là Rails) có thể khiến bạn khó hiểu tại sao có chuyện gì đó xảy ra. Bất kỳ mô-đun nào được khai báo trong đường dẫn tự động tải sẽ chỉ được tải nếu tên mô-đun tương ứng với tên thư mục mẹ. Vì vậy, trong trường hợp bạn cố gắng đưa vào lib/my_stuff/bar.rb
một cái gì đó như:
module Foo
class Bar
end
end
Nó sẽ không được tải tự động. Sau đó, một lần nữa nếu bạn đổi tên thư mục mẹ để foo
lưu trữ mô-đun của bạn tại đường dẫn : lib/foo/bar.rb
. Nó sẽ ở đó cho bạn. Một tùy chọn khác là đặt tên cho tệp bạn muốn tự động tải theo tên mô-đun. Rõ ràng chỉ có thể có một tập tin theo tên đó. Trong trường hợp bạn cần chia nội dung của mình thành nhiều tệp, tất nhiên bạn có thể sử dụng một tệp đó để yêu cầu các tệp khác, nhưng tôi không khuyến nghị điều đó, vì khi đó ở chế độ phát triển và bạn sửa đổi các tệp khác đó thì Rails không thể tự động tải lại chúng cho bạn. Nhưng nếu bạn thực sự muốn, bạn có thể có một tệp theo tên mô-đun, sau đó chỉ định các tệp thực tế cần thiết để sử dụng mô-đun. Vì vậy, bạn có thể có hai tệp: lib/my_stuff/bar.rb
và tệp lib/my_stuff/foo.rb
trước giống như trên và tệp sau chứa một dòng duy nhất:require "bar"
và điều đó sẽ làm việc như nhau.
PS tôi cảm thấy bắt buộc phải thêm một điều quan trọng. Gần đây, bất cứ khi nào tôi muốn có một cái gì đó trong thư mục lib cần được tải tự động, tôi có xu hướng bắt đầu nghĩ rằng nếu đây là thứ mà tôi thực sự phát triển riêng cho dự án này (thường là vậy, nó có thể là một ngày nào đó biến thành một đoạn mã "tĩnh" được sử dụng trong nhiều dự án hoặc một mô hình con git, v.v. trong trường hợp đó chắc chắn nó phải nằm trong thư mục lib) thì có lẽ vị trí của nó không nằm trong thư mục lib. Có lẽ nó nên ở trong thư mục con trong thư mục ứng dụng · Tôi có cảm giác rằng đây là cách làm việc mới. Rõ ràng, phép thuật tương tự đang hoạt động ở bất cứ nơi nào trong bạn tự động tải các đường dẫn mà bạn đặt công cụ của mình vào để điều đó tốt cho những điều này. Dù sao, đây chỉ là suy nghĩ của tôi về chủ đề này. Bạn được tự do không đồng ý. :)
CẬP NHẬT: Về loại phép thuật ..
Như severin đã chỉ ra trong nhận xét của mình, lõi "tự động tải một cơ chế mô-đun" chắc chắn là một phần của Ruby, nhưng các công cụ đường dẫn tự động tải thì không. Bạn không cần Rails để làmautoload :Foo, File.join(Rails.root, "lib", "my_stuff", "bar")
. Và khi bạn cố gắng tham chiếu mô-đun Foo lần đầu tiên thì nó sẽ được tải cho bạn. Tuy nhiên, những gì Rails làm là nó cho chúng ta một cách để thử và tải các thứ tự động từ các thư mục đã đăng ký và điều này đã được thực hiện theo cách mà nó cần phải thừa nhận điều gì đó về các quy ước đặt tên. Nếu nó không được thực hiện như vậy, thì mỗi khi bạn tham chiếu thứ gì đó hiện chưa được tải, nó sẽ phải đi qua tất cả các tệp trong tất cả các thư mục tự động tải và kiểm tra xem có bất kỳ tệp nào trong đó chứa những gì bạn đang cố gắng tham khảo không. Điều này đến lượt nó sẽ đánh bại ý tưởng tự động tải và tự động tải. Tuy nhiên, với các quy ước này, nó có thể khấu trừ từ mô-đun / lớp mà bạn đang cố tải ở nơi có thể được xác định và chỉ tải nó.
app/lib
.