2013-12-18 38 views
9

simple_form görünümünde polimorfik ilişkiyi göstermenin bir yolu var mı? Simpleform'da polimorfik ilişkilendirme

= simple_form_for(@chat, :html => { :class => "form-horizontal" }, :wrapper => "horizontal", defaults: { :input_html => { class: "form-control"}, label_html: { class: "col-lg-4" } }) do |f| 
    = f.error_notification 

    .form-inputs 
     = f.association :from_user 
     = f.association :to_user 
     = f.input :message 
     = f.association :chattable 

    .form-actions 
     = f.button :submit 

Ve modele altında

:

class Chat < ActiveRecord::Base 
    belongs_to :from_user, :foreign_key => 'from_user_id', class_name: 'User' 
    belongs_to :to_user, :foreign_key => 'to_user_id', class_name: 'User' 
    belongs_to :chattable, polymorphic: true 

    validates :from_user, associated: true, presence: true 
    validates :message, presence: true 
end 

Bu hata aşağıda atar:

Şimdiye kadar aşağıda var çok etek, hawing sayesinde

uninitialized constant Chat::Chattable 
+0

Bu, bir sorun sorununa benziyor. Bize Chattable modelini gösterebilir misin? – Narfanator

+0

"Chattable" modelim yok. 'Polymorphic'' ve' chat'' tablosunun bir parçası –

+0

Wait. Uygulamanız modelinizin yanı sıra 'Chat' olarak mı adlandırıldı? Bu senin problemin olabilir. 'Sohbet' sınıfını yeniden adlandırmayı ve ardından 'set_table_name "sohbetleri" yi kullanmayı deneyin. – Narfanator

cevap

5

ve ileri geri, SimpleForm'un bunu yapmadığını belirledik.

İşte nedeni! (Muhtemelen neden)

SimpleForm, ilişkilendirmenin hangi sınıf için olduğunu öğrenmelidir. Varsayılan durum, ilişkilendirmenin adının sınıfın büyük harfsiz adı olması olduğundan, "Chattable" sınıfını aramaya başlar ve onu bulamadığınız bir hatayı bulur.

İyi haber şu ki, yapmanız gereken tek şey, f.association :chattable hattını ihtiyacın olan şeylerle değiştirmektir. http://guides.rubyonrails.org/form_helpers.html#making-select-boxes-with-ease, bu "kolay yol" - Rails form yardımcıları ile aka - yapmak için gereken bilgiye sahiptir.

Benim önerim, chattable_type için bir seçim kutusu ve bu türün seçim kutusu için HTML'yi gizleyen bazı JS'lere sahip olmaktır. Böylece, JS ve CSS'yi içermeyen

gibi bir şey elde edersiniz. Gerçek sözdizimi için yukarıda bağlantılı dokümanları kontrol edin; Bence benimki biraz kapalı.

+0

Bu ve tüm yardımlarınız için çok teşekkür ederim !! –

+2

Sorun değil! Problem çözme eğlenceli şeylerdir ve şimdi Rails'in nasıl çalıştığı hakkında daha fazla şey biliyorum. – Narfanator

7

JS manipülasyonu gerektirmeyen ve hala basit form girdisi kullanabilen başka bir çözüm buldum. Girdi seçimini id ile kullanabilir ve seçenek değeri olarak geçirilen virgülle ayrılmış olarak yazabilirsiniz. Sonra Sohbet modelde

= f.input :chattable, collection: @chat.chattables, selected: f.object.chattable.try(:signature), 

:

def chattables 
    PolymorphicModel.your_condition.map {|t| [t.name, t.signature] } 
    end 

    def chattable=(attribute) 
    self.chattable_id, self.chattable_type = attribute.split(',') 
    end 

Ve PylymorphicModel

def signature 
    [id, type].join(",") 
    end 

Eğer bunları kullanmak güvenli params için chattable eklemeyi unutmayın içinde

.