मेरी समस्या यह है कि मैंने accepts_nested_attributes_for की सीमाओं में भाग लिया है, इसलिए मुझे यह समझने की आवश्यकता है कि अधिक कार्यक्षमता प्राप्त करने के लिए मुझे उस कार्यक्षमता को दोहराने के लिए कैसे करें। (मुझे नीचे लटकने के लिए नीचे देखें।) तो मेरा सवाल यह है कि: मेरा फॉर्म, कंट्रोलर और मॉडल कैसा दिखना चाहिए यदि मैं नकल करना चाहता हूं और accepts_nested_attributes_for बढ़ा सकता हूं? असली चाल है कि मुझे मौजूदा एसोसिएशन/विशेषताओं के साथ मौजूदा और नए मॉडल दोनों को अपडेट करने में सक्षम होना चाहिए।रेल - accepts_nested_attributes_for का उपयोग किये बिना नेस्टेड विशेषताओं का प्रबंधन कैसे करें?
मैं एक ऐप बना रहा हूं जो नेस्टेड रूपों का उपयोग करता है। मैंने शुरुआत में इस रेलस्कास्ट को ब्लूप्रिंट के रूप में उपयोग किया (accepts_nested_attributes_for लीवरेजिंग): Railscast 196: Nested Model Form।
मेरा ऐप नौकरियों (कार्यों) के साथ चेकलिस्ट है, और मैं उपयोगकर्ता को चेकलिस्ट (नाम, विवरण) अपडेट करने और एक ही रूप में संबंधित नौकरियों को जोड़ने/निकालने की अनुमति दे रहा हूं। यह अच्छी तरह से काम करता है, लेकिन जब मैं इसे अपने ऐप के किसी अन्य पहलू में शामिल करता हूं तो मैं समस्याओं में भाग लेता हूं: संस्करण के माध्यम से इतिहास।
मेरे ऐप का एक बड़ा हिस्सा यह है कि मुझे अपने मॉडल और एसोसिएशन के लिए ऐतिहासिक जानकारी रिकॉर्ड करने की आवश्यकता है। मैंने अपना खुद का संस्करण रोलिंग समाप्त कर दिया (here मेरा प्रश्न है जहां मैं अपनी निर्णय प्रक्रिया/विचारों का वर्णन करता हूं), और इसका एक बड़ा हिस्सा वर्कफ़्लो है जहां मुझे पुरानी चीज़ का नया संस्करण बनाना है, नए संस्करण में अपडेट करना है पुराने संस्करण को संग्रहित करें। यह उपयोगकर्ता के लिए अदृश्य है, जो यूआई के माध्यम से एक मॉडल को अद्यतन करने के अनुभव को देखता है।
कोड - मॉडल
#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
कोड - मौजूदा फार्म (नोट: @jobs जाँच सूची नियंत्रक कार्रवाई संपादन में इस चेकलिस्ट के लिए संग्रह से निकाला गया नौकरियों के रूप में परिभाषित किया गया है, तो @checklist है)
<%= 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 %>
कोड - checklists_controller.rb से स्निपेट # अद्यतन
def update
@oldChecklist = Checklist.find(params[:id])
# Do some checks to determine if we need to do the new copy/archive stuff
@newChecklist = @oldChecklist.dup
@newChecklist.parent_id = (@oldChecklist.parent_id == 0) ? @oldChecklist.id : @oldChecklist.parent_id
@newChecklist.predecessor_id = @oldChecklist.id
@newChecklist.version = (@oldChecklist.version + 1)
@newChecklist.save
# Now I've got a new checklist that looks like the old one (with some updated versioning info).
# For the jobs associated with the old checklist, do some similar archiving and creating new versions IN THE JOIN TABLE
@oldChecklist.checklists_jobs.archived_state(:false).each do |u|
x = u.dup
x.checklist_id = @newChecklist.id
x.save
u.archive
u.save
end
# Now the new checklist's join table entries look like the old checklist's entries did
# BEFORE the form was submitted; but I want to update the NEW Checklist so it reflects
# the updates made in the form that was submitted.
# Part of the params[:checklist] has is "jobs_attributes", which is handled by
# accepts_nested_attributes_for. The problem is I can't really manipulate that hash very
# well, and I can't do a direct update with those attributes on my NEW model (as I'm
# trying in the next line) due to a built-in limitation.
@newChecklist.update_attributes(params[:checklist])
और जहां मैं चलाता हूं accepts_nested_attributes_for सीमा के लिए (यह बहुत अच्छी तरह से here दस्तावेज है। मुझे "आईडी = वाई" अपवाद के साथ मॉडल 2 के लिए आईडी = एक्स के साथ मॉडल 1 नहीं मिला, जो मूल रूप से डिज़ाइन किया गया है।
तो, मैं कई नेस्टेड मॉडल कैसे बना सकता हूं और उन्हें मूल मॉडल के रूप में जोड़/हटा सकता हूं जो accepts_nested_attributes_for करता है, लेकिन स्वयं ही?
मैंने जो विकल्प देखा है - इनमें से एक सबसे अच्छा है? वास्तविक चाल मुझे मौजूदा संगठनों/विशेषताओं के साथ मौजूदा और नए मॉडल दोनों को अपडेट करने में सक्षम होने की आवश्यकता है। मैं उन्हें लिंक नहीं कर सकता, इसलिए मैं उन्हें नाम दूंगा।
Redtape (GitHub पर) Virtus (भी GitHub)
आपकी मदद के लिए धन्यवाद!
यदि आपने इसे हल किया है तो मुझे आपका समाधान देखने में बहुत दिलचस्पी होगी। –
मारियो, मैंने इसे हल किया, और मैंने नीचे अपना कोड पोस्ट किया। यह बहुत अच्छा कोड नहीं है, लेकिन यदि आप कुछ इसी तरह से संघर्ष कर रहे हैं, तो शायद यह आपको कुछ विचार देगा। कोई सवाल, बस यहां या मेरे उत्तर पर टिप्पणी करें और यदि मैं कर सकता हूं तो मैं स्पष्ट करने की कोशिश करूंगा। – JoshDoody