Sorunum, accepts_nested_attributes_for'un sınırlamalarına girdiğimden, daha fazla esnekliğe sahip olmak için bu işlevselliği kendi başıma nasıl kopyalayacağımı bulmam gerekiyor. (Beni tam olarak neyin asılı tuttuğuna bakmak için aşağıya bakın.) Bu yüzden sorum: Fors_nested_attributes_for'u taklit etmek ve büyütmek istiyorsam formum, denetleyici ve modellerim nasıl görünmeli? Gerçek hile, mevcut VE yeni modelleri mevcut ilişkilendirmeler/özniteliklerle güncelleyebilmem gerekiyor.Raylar - accepts_nested_attributes_for'u kullanmadan iç içe öznitelikleri nasıl yönetilir?
Yuvalanmış formlar kullanan bir uygulama yapıyorum. İlk olarak bu RailsCast'i bir plan olarak kullandım (accepts_nested_attributes_for): Railscast 196: Nested Model Form.
Uygulamam, işler (görevler) içeren denetim listeleridir ve kullanıcının denetim listesini (adı, açıklaması) güncelleştirmesini ve ilişkili işleri tek bir biçimde ekle/kaldırmasına izin veriyorum. Bu iyi çalışıyor, ancak bunu uygulamamın başka bir yönüne dahil ettiğimde sorun yaşıyorum: sürüm oluşturma yoluyla geçmiş.
Uygulamamın büyük bir kısmı, modelleri ve ilişkilendirmelerim için geçmiş bilgileri kaydetmem gerektiğidir. Kendi versiyonumuzu hazırladım (here benim karar sürecimi/düşüncelerimi tanımladığım bir sorudur) ve bunun büyük bir kısmı eski bir şeyin yeni bir versiyonunu oluşturmam gereken, yeni versiyona güncellemeler yapmam gereken bir iş akışı. eski sürümü arşivleyin. Bu, deneyimi UI aracılığıyla bir modeli güncellemek olarak gören kullanıcıyı görmezden geliyor.
Kodu - modeller
#checklist.rb
class Checklist < ActiveRecord::Base
has_many :jobs, :through => :checklists_jobs
accepts_nested_attributes_for :jobs, :reject_if => lambda { |a| a[:name].blank? }, :allow_destroy => true
end
#job.rb
class Job < ActiveRecord::Base
has_many :checklists, :through => :checklists_jobs
end
Kodu - Geçerli formu (NOT: @jobs kontrol listeleri kontrolör düzenleme eylem bu denetim için arşivden işler olarak tanımlanır; bu yüzden @checklist olan)
<%= simple_form_for @checklist, :html => { :class => 'form-inline' } do |f| %>
<fieldset>
<legend><%= controller.action_name.capitalize %> Checklist</legend><br>
<%= f.input :name, :input_html => { :rows => 1 }, :placeholder => 'Name the Checklist...', :class => 'autoresizer' %>
<%= f.input :description, :input_html => { :rows => 3 }, :placeholder => 'Optional description...', :class => 'autoresizer' %>
<legend>Jobs on this Checklist - [Name] [Description]</legend>
<%= f.fields_for :jobs, @jobs, :html => { :class => 'form-inline' } do |j| %>
<%= render "job_fields_disabled", :j => j %>
<% end %>
</br>
<p><%= link_to_add_fields "+", f, :jobs %></p>
<div class="form-actions">
<%= f.submit nil, :class => 'btn btn-primary' %>
<%= link_to 'Cancel', checklists_path, :class => 'btn' %>
</div>
</fieldset>
<% end %>
Code - snippet from checklists_controller.rb # Güncelle
Ve işte burada çalışıyorum accepts_nested_attributes_for sınırlaması için nto (oldukça iyi bir şekilde belgeleniyor here. Temel olarak tasarlandığı şekliyle "Model1 için ID = X ile Model1 bulunamadı;" ID = Y "istisnası aldım.
Peki, birden çok iç içe geçmiş model oluşturabilir ve üst modelin formunu kabulprefined_attributes_içine benzer şekilde ekleyebilir veya kaldırabilirim, ancak kendi başıma?
Gördüğüm seçenekler - bunlardan en iyisi mi? Gerçek hile, mevcut VE yeni modelleri mevcut ilişkilendirmeler/özniteliklerle güncelleyebilmem gerekir. Onları birbirine bağlayamıyorum, bu yüzden onları adlandıracağım.
Redtape (github üzerinde) Virtus (aynı zamanda github) Yardımlarınız için
teşekkürler!
Bunu çözdüyseniz, çözümünüzü görmeyi çok isterim. –
Mario, Bunu çözdüm ve kodumu aşağıda yayınladım. Bu harika bir kod değil, ama benzer bir şeyle uğraşıyorsanız, belki size bazı fikirler verecektir. Herhangi bir sorunuz varsa, sadece burayı veya cevabım hakkında yorum yazabilirim ve yapabileceklerimi açıklamaya çalışacağım. – JoshDoody