2010-02-01 12 views
6

Bir akışa farklı biçimlerdeki dosyaları eklememe izin veren bir form var. Yani, bir akış birçok dosyadan oluşur, bu dosyalar XML dosyalarıdır ancak temel olarak farklı şemalara sahiptir. Kullanıcının istediği dosyayı eklemesine izin veren bir formum var, STI kullanıyorum (veri zaten tablodayken harika çalışıyor), veriim tabloya veri ekliyor.STI ONE formu kullanarak STI

Formda, kullanıcının karşıya yüklemek istediği dosyayı seçmesine izin veren bir file_field olmak üzere 1 giriş alanı vardır. Sadece bir form var çünkü doğru nesneyi başlatamıyorum, bunu programlı olarak yapmalıyım ve nasıl yapacağımı bilmiyorum.

Mümkün olan tiplerde bir açılır liste ekleyebilir miyim ve bu alana 'tür' adını veriyorum, böylece form gönderilirken, yazım nesnesi türü öznitelik sağlandığından yazım nesnesini oluşturacak mı?

Bunun için en iyi uygulama nedir .. Rayları çalıştırıyorum 2.3.4.

cevap

3

Ben http://coderrr.wordpress.com/2008/04/22/building-the-right-class-with-sti-in-rails/#comment-1826

class GenericClass < ActiveRecord::Base 
    class << self 
    def new_with_cast(*a, &b) 
     if (h = a.first).is_a? Hash and (type = h[:type] || h['type']) and (klass = type.constantize) != self 
     raise "wtF hax!!" unless klass < self # klass should be a descendant of us 
     return klass.new(*a, &b) 
     end 

     new_without_cast(*a, &b) 
    end 
    alias_method_chain :new, :cast 
    end 
end 
bir çözüm buldu

En az kod ile benim için harika çalıştı - hackish olup olmadığını bilmiyorum ama işe yaramaz ve oldukça temiz. Ben onun sadece 10ish kod satırını sevdim.

+1

artı 1 "wtF hax !!" – tybro0103

0

Kaç tane türü olduğunu bilmiyorum, ancak geçmişte farklı türlerde ayrı denetleyiciler ve görüşler kullandım. Bu şekilde, temel sınıfın yeni nesnesini oluşturmazsınız ve türü ayarlamaya çalışırsınız, sadece temel sınıftan miras alınan modeli kullanırsınız. Kaynaklarınız için her yeni/düzenleme sayfası, form_for bloğunda paylaşılan bir kısmi oluşturabilir. Kısmi, dosya alanınızı içerecektir.

Bu yol, form gönderildiğinde doğru denetleyiciye gidecektir, doğru resource.new çağrılıyor ve her şey yolunda.

Tabii ki dezavantajı daha fazla dosyadır ve "yeni dosya ekle" ye bağlandığınız sayfa ne olursa olsun "yeni dosya türü ekle", "yeni dosya türü ekle" vb. Gibi birden çok bağlantı eklemeniz gerekir.

Biçimdeki türün ayarlanmasında, çalışıp çalışmadığından emin değilim, bundan şüphe ediyorum ama sadece bir deneyin (Bizi bilgilendirin). Bu tür bir select_tag indirmeyi yapabilir ve değiştirdiğinizde formdaki eylem yerini değiştirmek için Javascript'i kullanabilirsiniz.

Düzenlenmiş ve ben & şüphe Bu çözümü gibi o

Değil etrafında temel eser eklendi onun hiçbir iyi gelir, ama sen gerçekten ayrı denetleyicileri istemiyoruz eğer sizi çalışma almak gerekir göre böyle bir şey yapabileceğini:

class XmlFile < ActiveRecord::Base 
end 

class XmlFileTypeA < XmlFile 
end 

class XmlFileTypeB < XmlFile 
end 

def create 
    # Leaving this case statement in the controller for simplicity but you probably want to move this to the model 
    case params[:chosen_xml_type] 
     when "file_type_a" 
     @item = XmlFileTypeA.new(params) 
     when "file_type_b" 
     @item = XmlFileTypeB.new(params) 
     else 
     raise "Unknown file type!" 
     etc 
    end 
end 
+0

Evet, her biri için ayrı bir denetleyici oluşturmaktan kaçınmak istedim, şu anda yalnızca iki belge türüne sahibim, daha hızlı olabilir. Raylar STI'yi uygulamak için bu kadar basit görünmesini sağlıyor ve bu sadece bilgi almak için bir STI uygulaması için 'yeni' bir formun bir örneğini bile bulamıyorum. – Rabbott

+0

Düzenlenmiş gönderiyi görüyorsanız, görünümü oluşturan yeni eylem @xml_file = XmlFile.new oluşturur. Oluşturma eylemi, kullanıcı seçimine göre sizin için doğru dosya türünü oluşturur. Umarım çamur gibi berraktır !? – tsdbrown

+0

Bu daha yakın oluyor, güncellememiz için teşekkürler! Denetleyici, aslında nesneyi örneklendiren şey olduğundan, orada kalması gerekmez mi? Sanırım, tüm bu araştırmalardan sonra, aradığım şey, classify.constanize.new veya bunun gibi bir şeyi arayabileceğiniz yöntemdir. Ne hakkında konuştuğum hakkında bir fikir. Değeri aşağı açılır menüden kullanabilir ve bu tür bir nesne oluşturabilirsin .. – Rabbott

İlgili konular