Vì Rails cung cấp cấu trúc theo thuật ngữ MVC, nên cuối cùng chỉ sử dụng các thùng chứa mô hình, khung nhìn và bộ điều khiển được cung cấp cho bạn. Thành ngữ điển hình cho người mới bắt đầu (và thậm chí một số lập trình viên trung gian) là nhồi nhét tất cả logic trong ứng dụng vào mô hình (lớp cơ sở dữ liệu), trình điều khiển hoặc khung nhìn.
Tại một số thời điểm, ai đó chỉ ra mô hình "mô hình béo, bộ điều khiển gầy" và các nhà phát triển trung gian vội vã lấy tất cả mọi thứ từ bộ điều khiển của họ và ném nó vào mô hình, bắt đầu trở thành thùng rác mới cho logic ứng dụng.
Trên thực tế, bộ điều khiển gầy là một ý tưởng tốt, nhưng hệ quả - đưa mọi thứ vào mô hình, thực sự không phải là kế hoạch tốt nhất.
Trong Ruby, bạn có một vài lựa chọn tốt để biến mọi thứ thành mô-đun hơn. Một câu trả lời khá phổ biến là chỉ sử dụng các mô-đun (thường được đặt trong lib
) chứa các nhóm phương thức, sau đó đưa các mô-đun vào các lớp thích hợp. Điều này giúp ích trong trường hợp bạn có các loại chức năng mà bạn muốn sử dụng lại trong nhiều lớp, nhưng trong đó chức năng vẫn được gắn liền với các lớp.
Hãy nhớ rằng, khi bạn bao gồm một mô-đun vào một lớp, các phương thức trở thành các phương thức cá thể của lớp, vì vậy bạn vẫn kết thúc với một lớp chứa hàng tấn phương thức, chúng chỉ được tổ chức thành nhiều tệp.
Giải pháp này có thể hoạt động tốt trong một số trường hợp - trong các trường hợp khác, bạn sẽ muốn nghĩ về việc sử dụng các lớp trong mã không phải là mô hình, khung nhìn hoặc bộ điều khiển.
Một cách tốt để suy nghĩ về nó là "nguyên tắc trách nhiệm duy nhất", nói rằng một lớp nên chịu trách nhiệm cho một (hoặc một số lượng nhỏ) các sự việc. Các mô hình của bạn chịu trách nhiệm lưu trữ dữ liệu từ ứng dụng của bạn đến cơ sở dữ liệu. Bộ điều khiển của bạn có trách nhiệm nhận được yêu cầu và trả lại phản hồi khả thi.
Nếu bạn có các khái niệm không phù hợp gọn gàng trong các hộp đó (sự kiên trì, quản lý yêu cầu / phản hồi), bạn có thể muốn nghĩ về cách bạn sẽ mô hình hóa ý tưởng trong câu hỏi. Bạn có thể lưu trữ các lớp không mô hình trong ứng dụng / lớp hoặc bất kỳ nơi nào khác và thêm thư mục đó vào đường dẫn tải của bạn bằng cách thực hiện:
config.load_paths << File.join(Rails.root, "app", "classes")
Nếu bạn đang sử dụng hành khách hoặc JRuby, có lẽ bạn cũng muốn thêm đường dẫn của mình vào đường dẫn tải háo hức:
config.eager_load_paths << File.join(Rails.root, "app", "classes")
Điểm mấu chốt là một khi bạn đi đến một điểm trong Rails nơi bạn thấy mình hỏi câu hỏi này, đã đến lúc tăng cường các nhóm Ruby của bạn và bắt đầu mô hình hóa các lớp không chỉ là các lớp MVC mà Rails cung cấp cho bạn theo mặc định.
Cập nhật: Câu trả lời này áp dụng cho Rails 2.x trở lên.