Rails

2009-03-31 11 views
8

STI sınıfının temel sınıfı için rota alın 3 model, Kişi, Yer ve Thing ile bir raylı uygulamasına sahip olduğumu varsayalım. Thing'in tek bir tablo devralması kullandığını söyleyin, bu yüzden FancyThing ve ScaryThing alt sınıfları vardır. Sonra map.resources :people, :places, :things ile tanımlanan yollar vardır. Yani FancyThings ve ScaryThings için hiçbir denetleyici yok, ThingsController her iki türü de ele alır.Rails

Şimdi, her şeyin bağlantılarının bir listesini gösteren bir kodun olması gerektiğini söylüyorum. Benim görünümünde bu kodu varsa: öğenin bir Kişi veya yer olduğunu

<% @items.each do |item| %> 
    <%= link_to item.name, item %> 
<% end %> 

, bu polymorphic_path doğru rotayı üreten ilgilenir, gayet iyi çalışıyor. Ama eğer öğe bir FancyThing veya ScaryThing ise, bu patlar, çünkü hiçbir yol olmadığı fancy_thing_path'u kullanmayı deneyecektir. Bir şekilde thing_path'u kullanmak istiyorum. İdeal olarak, bir şekilde alt sınıfların rotayı oluşturmak için taban sınıfını kullanması gerektiğini gösteren, Thing ve/veya alt sınıfları üzerinde bir yöntem olacaktır. Bunun için şık bir çözüm var mı?

+0

Bu, rayların geliştirilmesi için bir [açık bilet] (http://dev.rubyonrails.org/ticket/10454) 'dir. Bununla nasıl başa çıkılacağına dair öneriler için bilete bakın. – MarkusQ

cevap

12

/:

<% @items.map {|i| if i.class < Thing then i.becomes(Thing) else i end}.each do |item| %> 
    <%= link_to item.name, item %> 
<% end %> 

Bu ActiveRecord işlevini "olur" kullanır yapmak için bu yolları kullanarak, gibi adresler ile sona erecek Thing taban sınıfına Thing'in tüm alt sınıflarının bir "yukarı-cast".

+0

Güzel, ben bilmiyordum, teşekkürler! – pjb3

+0

Bu çözüm, beklediğim kadar zarif yaklaşık 10x. –

8

bir doğru cevabı yok mu

map.resources :things 
map.resources :fancy_things, :controller => 'things' 
map.resources :scary_things, :controller => 'things' 
+1

+1 İki sebepten dolayı 1) Bu benim için çalışıyor. 2) Bu cevap @ pjb3 tarafından kabul edilene göre daha fazla kurutucuya benziyor. Teşekkürler. – Rohit

+0

Bu çözüm çalışıyor, ancak sınıf/türe zorlamadığından aşağı tarafı vardır, ör. Bir kimliği http: // localhost: 3000/fancy_things/21 aracılığıyla sorgularsanız ve bu öğe aslında başka bir alt sınıf ScaryThings'den geliyorsa, yine de geçerli bir yanıt alırsınız. Aslında bir hata vermeliydi, çünkü bu sınıf FancyThings değil. – Tilo

0

kullanmayı deneyin, ama en azından sigara KURU kodu kullanarak bu sorunla başa çıkabilirim:

map.resources: şeyler,: Has_many => : fancy_things,: kontrolör => 'şeyler',: map.resources maddeler has_many =>: scary_things,: kontrolör => 'şeyler',: has_many =>:

Umut maddeleri map.resources maddeler meseleyi yakında düzelteceğim, çünkü görmek isterim fancy_things sadece tarafından yönetilir: şeyler denetleyicisi. belki istiyorum oysa fancy_things/1/işler/Bu hile olacaktır 1