Karena Rails menyediakan struktur dalam hal MVC, wajar jika hanya menggunakan wadah model, tampilan, dan pengontrol yang disediakan untuk Anda. Ungkapan khas untuk pemula (dan bahkan beberapa programmer menengah) adalah menjejalkan semua logika dalam aplikasi ke dalam model (kelas basis data), pengontrol, atau tampilan.
Pada titik tertentu, seseorang menunjukkan paradigma "model-gemuk, pengontrol-kurus", dan pengembang menengah buru-buru mengeluarkan semuanya dari pengontrol mereka dan memasukkannya ke dalam model, yang mulai menjadi tong sampah baru untuk logika aplikasi.
Pengendali kurus, pada kenyataannya, adalah ide yang bagus, tetapi akibat wajar - meletakkan segala sesuatu dalam model, sebenarnya bukan rencana terbaik.
Di Ruby, Anda memiliki beberapa opsi bagus untuk membuat hal-hal lebih modular. Jawaban yang cukup populer adalah dengan hanya menggunakan modul (biasanya disimpan lib
) yang menampung kelompok metode, dan kemudian memasukkan modul ke dalam kelas yang sesuai. Ini membantu dalam kasus-kasus di mana Anda memiliki kategori fungsionalitas yang ingin Anda gunakan kembali di beberapa kelas, tetapi di mana fungsionalitasnya secara melekat masih melekat pada kelas.
Ingat, ketika Anda memasukkan modul ke dalam kelas, metode tersebut menjadi metode instan kelas, jadi Anda masih berakhir dengan kelas yang berisi banyak metode, mereka hanya disusun dengan baik ke dalam beberapa file.
Solusi ini dapat bekerja dengan baik dalam beberapa kasus - dalam kasus lain, Anda akan ingin berpikir tentang menggunakan kelas dalam kode Anda yang bukan model, tampilan atau pengontrol.
Cara yang baik untuk memikirkannya adalah "prinsip tanggung jawab tunggal," yang mengatakan bahwa kelas harus bertanggung jawab atas satu hal (atau jumlah kecil). Model Anda bertanggung jawab untuk menyimpan data dari aplikasi Anda ke basis data. Pengontrol Anda bertanggung jawab untuk menerima permintaan dan mengembalikan respons yang layak.
Jika Anda memiliki konsep yang tidak cocok dengan kotak-kotak itu (ketekunan, manajemen permintaan / tanggapan), Anda mungkin ingin memikirkan bagaimana Anda akan memodelkan ide yang dimaksud. Anda dapat menyimpan kelas non-model di aplikasi / kelas, atau di mana pun, dan menambahkan direktori itu ke jalur pemuatan Anda dengan melakukan:
config.load_paths << File.join(Rails.root, "app", "classes")
Jika Anda menggunakan penumpang atau JRuby, Anda mungkin juga ingin menambahkan jalur Anda ke jalur muatan yang diinginkan:
config.eager_load_paths << File.join(Rails.root, "app", "classes")
Intinya adalah bahwa begitu Anda sampai ke suatu titik di Rails di mana Anda menemukan diri Anda mengajukan pertanyaan ini, sekarang saatnya untuk menambah potongan-potongan Ruby Anda dan mulai memodelkan kelas yang bukan hanya kelas MVC yang Rails berikan secara default.
Pembaruan: Jawaban ini berlaku untuk Rails 2.x dan lebih tinggi.