Benim Raylar görüş ve denetleyiciler ile çevrili redirect_to
, link_to
ve form_for
yöntem çağrıları. Bazen link_to
ve redirect_to
bağladıkları yollarda açıktırlar (örneğin link_to 'New Person', new_person_path
), ancak birçok kez yollar örtüktür (örn. link_to 'Show', person
).
Benim model (say) için bazı tek tablo kalıtım (STI) eklemek Employee < Person
ve tüm bu yöntemler alt sınıf (say Employee
) bir örneği için kırmak ; raylar yürütüldüğünde link_to @person
hata verir undefined method employee_path' for #<#<Class:0x000001022bcd40>:0x0000010226d038>
. Rails, çalışanın nesnenin sınıf adıyla tanımlanan bir rota arıyor. Bu çalışan yolları tanımlanmamıştır ve çalışan denetleyicisi yoktur, bu nedenle eylemler de tanımlanmaz.
Bu soru daha önce sorulmuştur:
- At StackOverflow , cevap tüm kod temeli link_to vb her örneğini düzenlemek ve açıkça yolunu ortaya koymaktır
- On StackOverflow yine iki kişi kullanıyor önermek
routes.rb
ana sınıfına alt sınıf kaynakları (haritayamap.resources :employees, :controller => 'people'
). Aynı SO sorusunun en üst yanıtı, kod tabanındaki her örnek nesneyi kullanarak.becomes
- StackOverflow'da bir başka soru da, en iyi cevap Kendini Tekrarla kampında yol ve her alt sınıf için yinelenen iskele oluşturmayı öneriyor.
- İşte aynı soru, en iyi cevabın sadece yanlış gibi göründüğü SO'da tekrar aynı soru (Rails magic Just Works!)
- Web'in başka yerlerinde, F2Andy'nin kodun her yerinde yolda düzenlemeyi önerdiği bu blog gönderisini buldum .
- Mantıksal Gerçeklik Tasarımında Tek Tablo Devralma ve RESTful Routes blog yayınında , yukarıdaki SO yanıt numarası 2'de olduğu gibi alt sınıfın kaynaklarının üst sınıf denetleyicisine eşlenmesi önerilir.
- Alex Reisner bir yazı vardır Rails Tek tablo Kalıtım içeri üst sınıfa çocuk sınıflarının kaynaklarını haritalama karşı savunan ettiği,
routes.rb
sadece yakalar gelen kırılmaları yönlendirme beri,link_to
veredirect_to
fakat gelenform_for
. Bu nedenle, alt sınıfların sınıfları hakkında yalan söylemesi için ana sınıfa bir yöntem eklemeyi önerir. Kulağa hoş geliyor, ama yöntemi bana hata verdiundefined local variable or method `child' for #
.
Bu yüzden en zarif görünen ve en fazla fikir birliğine sahip olan cevap (ama o kadar da zarif ya da bu kadar fikir birliği değil), kaynakları sizin için eklemektir routes.rb
. Bunun dışında işe yaramıyor form_for
. Netliğe ihtiyacım var! Yukarıdaki seçimleri damıtmak için seçeneklerim
- alt sınıfın kaynaklarını üst sınıftaki denetleyiciye eşler
routes.rb
(ve herhangi bir alt sınıfta form_for çağırmam gerekmez) - Sınıfların birbirlerine yatmasını sağlamak için rayların iç yöntemlerini geçersiz kıl
- Kodda, bir nesnenin eylemine giden yolun dolaylı ya da açıkça çağrıldığı her örneği, yolu değiştirerek ya da nesneyi yazarak düzenleyin.
Tüm bu çelişkili cevaplarla bir karara ihtiyacım var. Bana öyle geliyor ki iyi bir cevap yok. Bu rayların tasarımında başarısız mı? Eğer öyleyse, düzeltilebilecek bir hata mı? Ya da değilse, o zaman birisinin beni doğrudan buna ayarlayabileceğini, her seçeneğin artılarını ve eksilerini yürütebileceğini umuyorum (veya bunun neden bir seçenek olmadığını açıklayın) ve hangisinin doğru cevap olduğunu ve neden olduğunu umuyorum. Yoksa internette bulamadığım doğru bir cevap var mı?