Tampilan dan pengontrol Rails saya dipenuhi redirect_to
,link_to
, dan form_for
metode panggilan. Kadang link_to
- kadang dan redirect_to
eksplisit di jalur yang mereka tautkan (misalnya link_to 'New Person', new_person_path
), tetapi berkali-kali jalur tersebut tersirat (misalnya link_to 'Show', person
).
Saya menambahkan beberapa tabel pewarisan tunggal (STI) ke model saya (katakanlah Employee < Person
), dan semua metode ini istirahat untuk turunan dari subclass (katakanlah Employee
); ketika rel dieksekusi link_to @person
, kesalahan dengan undefined method employee_path' for #<#<Class:0x000001022bcd40>:0x0000010226d038>
. Rails mencari rute yang ditentukan oleh nama kelas objek, yaitu karyawan. Rute karyawan ini tidak ditentukan, dan tidak ada pengontrol karyawan sehingga tindakannya juga tidak ditentukan.
Pertanyaan ini telah diajukan sebelumnya:
- Di StackOverflow , jawabannya adalah mengedit setiap instance dari link_to dll di seluruh basis kode Anda, dan nyatakan path secara eksplisit
- Di StackOverflow lagi, dua orang menyarankan menggunakan
routes.rb
untuk memetakan sumber daya subclass ke kelas induk (map.resources :employees, :controller => 'people'
). Jawaban teratas dalam pertanyaan SO yang sama menyarankan tipe-casting setiap instance objek dalam basis kode menggunakan.becomes
- Namun satu lagi di StackOverflow , jawaban teratas adalah cara di kamp Do Repeat Yourself, dan menyarankan untuk membuat duplikat perancah untuk setiap subclass.
- Ini dia pertanyaan yang sama lagi di SO, di mana jawaban teratas sepertinya salah (Rails magic Just Works!)
- Di tempat lain di web, saya menemukan posting blog ini mana F2Andy merekomendasikan pengeditan di jalur mana pun dalam kode.
- Pada posting blog Single Table Inheritance dan RESTful Routes at Logical Reality Design, direkomendasikan untuk memetakan sumber daya untuk subclass ke pengontrol superclass, seperti pada jawaban SO nomor 2 di atas.
- Alex Reisner memiliki posting Single Table Inheritance in Rails , di mana ia menganjurkan untuk tidak memetakan sumber daya dari kelas anak ke kelas induk di
routes.rb
, karena itu hanya menangkap kerusakan rute darilink_to
danredirect_to
, tetapi tidak dariform_for
. Jadi dia merekomendasikan sebagai gantinya menambahkan metode ke kelas induk untuk membuat subclass berbohong tentang kelas mereka. Kedengarannya bagus, tetapi metodenya memberi saya kesalahanundefined local variable or method `child' for #
.
Jadi jawaban yang tampaknya paling elegan dan memiliki paling konsensus (tapi itu tidak semua yang elegan, atau yang banyak konsensus), adalah menambah sumber daya untuk Anda routes.rb
. Kecuali ini tidak berhasil form_for
. Saya perlu kejelasan! Untuk menyaring pilihan di atas, opsi saya adalah
- memetakan sumber daya dari subclass ke controller dari superclass di
routes.rb
(dan harap saya tidak perlu memanggil form_for pada subclass mana pun) - Mengganti metode internal rel untuk membuat kelas berbohong satu sama lain
- Edit setiap instance dalam kode di mana path ke tindakan objek dipanggil secara implisit atau eksplisit, baik mengubah path atau ketik-casting objek.
Dengan semua jawaban yang saling bertentangan ini, saya perlu keputusan. Bagi saya sepertinya tidak ada jawaban yang baik. Apakah ini gagal dalam desain rel? Jika demikian, apakah itu bug yang mungkin diperbaiki? Atau jika tidak, maka saya berharap seseorang dapat meluruskan hal ini, memandu saya melalui pro dan kontra dari setiap opsi (atau menjelaskan mengapa itu bukan pilihan), dan mana yang merupakan jawaban yang tepat, dan mengapa. Atau ada jawaban yang tepat yang tidak saya temukan di web?