2011-02-24 21 views
8

Tek Tablo Kalıtım yoluyla diğer 2 tarafından devralınan bir temel sınıfım var. Tüm alt sınıfların çeşitli nedenlerle aynı denetleyici/görünümleri paylaşmasını istiyorum. Tek gerçek fark, modelin işlevselliğidir.Tek Denetleyici, çok (devralınan) sınıflar (raylar 3)

Ancak, link_to "stuff" işlevini kullanmaya çalıştığımda, example_of_child Doğru sayfayı bulamadığım için şikayetler alıyorum.

'/ subclass' => yönlendirme ('/ ebeveyn') eşleşmesiyle eşleşen eşleştirmeyi denedim ancak bu hiç mantıklı olmayan garip bağlantılar oluşturuyor. Baska öneri? Raylarda oldukça yeni ve route.rb hakkındaki bilgilerimin hala sınırlı olduğunu itiraf ediyorum, ancak bakmam gereken yerdeyken bile tamamen emin değilim. http://www.alexreisner.com/code/single-table-inheritance-in-rails itibaren

cevap

12

:

Hiç Bir üst sınıf eklediğinizde muhtemelen link_to birçok ve form_for yöntemler hataları atmak biliyoruz uygulama Raylar mevcut bir için STI eklemek için denedim . Bunun nedeni, ActionPack'in nesnesinin bir nesnesinin sınıfını yolunu ve URL'sini belirlemek için görmesi ve yeni alt sınıflarınız için eşlenmiş rotaları görmemesidir. Sen olsa bunu tavsiye vermez, bu nedenle gibi yolları ekleyebilirsiniz:

# NOT recommended: 
map.resources :cars,  :as => :vehicles, :controller => :vehicles 
map.resources :trucks,  :as => :vehicles, :controller => :vehicles 
map.resources :motorcycles, :as => :vehicles, :controller => :vehicles 

Bu yalnızca belirli bir semptomu hafifleten. Form_for formunu kullanırsak, form alanımızın hala beklediğimiz isimleri olacaktır (örneğin: params [: araba] [: renk] params [: araç] [: renk]) yerine. Bunun yerine, 'un kökenine, ana sınıfımızda model_adı yöntemini uygulayarak sormalıyız. Ben için herhangi dokümantasyonu bu tekniği görmedim, bu nedenle bu çok resmi olmayan, ama mantıklı ve Raylar benim için mükemmel çalışıyor 2.3 ve 3:

def self.inherited(child) 
    child.instance_eval do 
    def model_name 
     Vehicle.model_name 
    end 
    end 
    super 
end 

Bu muhtemelen kafa karıştırıcı görünüyor, bu yüzden açıklamama bakalım:

bir URL üreten yöntemini çağırdığınızda (örn: link_to ("araba", araba)), ActionPack aramalar modu Verilen nesne (burada araba) sınıfında l_name. Bu, özel bir dizesinin URL'lerde nesnenin olarak adlandırıldığını belirleyen özel bir tür döndürür. Burada yaptığımız tüm ana sınıfının adlandırılmış yolları kullanmak ve böylece ebeveyn sınıfı (Araç) ait olarak Araba, Kamyon ve Motosiklet alt sınıfları görmek ve edecek böylece ActionPack Araç alt sınıfları için MODEL_NAME yöntemi geçersiz olduğunu URL'lerin olduğu her yerde (VehiclesController) oluşturulur. Bu, Rails resource-style (RESTful) URL'lerini kullanarak olduğunuzu varsayar. (Değilseniz, lütfen yapın.) MODEL_NAME çağırma kendini araştırmak

, ActionController :: RecordIdentifier # model_name_from_record_or_class yöntemi için Raylar kaynak kodunu görmek. Raylar 2.3 yılında özel dize Raylar 3 içinde ActiveSupport :: ModelAdı örneğidir, bir ActiveModel olmasıdır :: Adı

+0

Bu aradığım tam olarak ne olduğunu. Yönlendirme tablosuyla mesajlaşma kötü bir çözüm gibi görünüyordu ve evet, formlarımı karıştırdığını fark ettim. Öyleyse, yukarıdaki örnekte sınıf adımı uydurmak için yaptığım küçük bir değişiklikle, çözümünüz benim sorunumu çözdü. Bu ekstra kontrol cihazlarını yaratmanın/sürdürmenin ne kadar korktuğum hakkında hiçbir fikrin yok. – user632657

+0

Bunu duyduğuma sevindim! :) –