Rails 4: Tổ chức các mô hình đường ray trong đường dẫn con mà không có mô hình không gian tên?


80

Liệu nó có thể có một cái gì đó như thế này?

app/models/
app/models/users/user.rb
app/models/users/education.rb

Mục đích là tổ chức thư mục / app / models tốt hơn, nhưng không cần phải đặt tên cho các model.

Một câu hỏi chưa được trả lời cho Rails 3 là ở đây: Rails 3.2.9 và các mô hình trong các thư mục con .

Việc chỉ định tên_bảng với không gian tên dường như hoạt động (xem thư mục con của mô hình Rails 4 ), nhưng tôi muốn thực hiện việc này mà không có không gian tên .


Tôi hiểu rằng bạn không muốn không gian tên, nhưng tôi nghĩ cách tốt nhất để làm điều đó là sử dụng ActiveSupport Concerns.
Nando Sousa

2
@NandoSousa. Không. ActiveSupport Mối quan tâm dành cho hành vi được chia sẻ. Cách bạn sử dụng các mô hình.
berkes

Câu trả lời:


116

Theo mặc định, Rails không thêm các thư mục con của thư mục mô hình vào đường dẫn tự động tải. Đó là lý do tại sao nó chỉ có thể tìm thấy các mô hình không gian tên - không gian tên chiếu sáng thư mục con cần tìm.

Để thêm tất cả các thư mục con của ứng dụng / mô hình vào đường dẫn tự động tải, hãy thêm phần sau vào config / application.rb :

config.autoload_paths += Dir[Rails.root.join("app", "models", "{*/}")]

Hoặc, nếu bạn có một phức tạp hơn ứng dụng / mô hình thư mục, các phương pháp trên của globing cùng tất cả các thư mục con của ứng dụng / mô hình có thể không hoạt động đúng. Trong trường hợp đó, bạn có thể giải quyết vấn đề này bằng cách rõ ràng hơn một chút và chỉ thêm các thư mục con mà bạn chỉ định:

config.autoload_paths += Rails.root.join("app", "models", "<my_subfolder_name1>")
config.autoload_paths += Rails.root.join("app", "models", "<my_subfolder_name2>")

CẬP NHẬT cho Rails 4.1+

Kể từ Rails 4.1, trình tạo ứng dụng không bao gồm config.autoload_pathstheo mặc định. Vì vậy, lưu ý rằng những điều trên thực sự thuộc về config / application.rb .

CẬP NHẬT

Đã sửa lỗi các ví dụ về đường dẫn tự động tải trong đoạn mã trên để sử dụng {*/}thay thế {**}. Hãy chắc chắn để đọc bình luận của muichkine để biết chi tiết về điều này.


6
Đã thử nhưng không thành công với Không thể tự động nạp liên tục Người dùng :: Credits, dự kiến ​​/srv/books/app/models/user/credits.rb để xác định nó. Vì vậy, nó vẫn không phải là các tệp được đặt tên cách nhau. Đặt chúng phía trên mục lib như được đề xuất.
Rubytastic

1
Lỗi này thực sự là một tin tốt. Nó có nghĩa là nó đã tìm thấy tệp. Tuy nhiên, bạn đang sử dụng một đa nguyên kỳ lạ ở đây. Nếu tên tập tin của bạn là app/models/user/credits.rbhãy đảm bảo rằng tên lớp trong file cũng là số nhiều: class Credits. Tuy nhiên, tôi khuyên bạn nên sử dụng tiêu chuẩn Rails và đặt nó class Creditvà tên tệp là app/models/user/credit.rb(các mô hình nên là số ít). Dù bằng cách nào, đây sẽ là vấn đề. Cho tôi biết!
pdobb 21/09/13

1
Trong cấu hình Rails 4.1 tôi sử dụngconfig.autoload_paths += %W( #{Rails.root}/app/models/namespace #{Rails.root}/app/models/other_namespace )
Epigene

14
config.autoload_paths += Dir[Rails.root.join('app', 'models', '{**}')]hoạt động nhưng làm chậm ứng dụng, đặc biệt trong chế độ phát triển nơi ứng dụng được tải lại thường xuyên. Lý do là bạn không được thêm tất cả các tệp vào autoload_paths mà chỉ thêm các thư mục gốc nơi sau đó có thể suy ra tên tệp và mô-đun. Trong các thuật ngữ đơn giản, nếu bạn chỉ có một cấp thư mục con vào các mô hình và không có mô hình không gian tên, bạn chỉ nên thực hiện điều config.autoload_paths += Dir[Rails.root.join('app', 'models', '*/')]này chỉ thêm cấp đầu tiên của các thư mục con. Tương tự cho libhoặc các đường dẫn khác.
muichkine

3
@pdobb đó là trải nghiệm :) nếu bạn nhìn vào cách tự động tải hoạt động, bạn sẽ thấy rằng nó lặp lại ở tất cả các vòng lặp auto_loading_pathsmà nó thêm vào suy luận cho mô hình. Ví dụ, nếu bạn có NameSpace::Modelnó, bạn sẽ cố gắng tìm trong tất cả các đường dẫn autoloading_path a path/namespace/model. Điều này rõ ràng chỉ có thể khớp khi pathlà một thư mục. Theo nguyên tắc chung, bạn chỉ nên có các thư mục trong autoload_pathsđể đạt hiệu quả tối đa. Hy vọng nó giúp.
muichkine
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.