سؤال

لديّ علاقة كثيرة مع مربع ارتباط ، وأريد سحب هذه النماذج معًا في نموذج واحد حتى أتمكن من التحديث من نفس الصفحة. أنا أعاني حقًا من الحصول على cock_box حتى لإظهار جميع عناصر صفيف بلدي - لقد بحثت عن الشبكة وعملت على هذا حرفيًا طوال اليوم ، وأجد صعوبة في تطبيق المعلومات التي أقرأها مشكلتي. أنا أيضًا جديد للغاية على ROR ، وقد أتابع قليلاً من برنامج تعليمي قديم (Pre 2.0) ، لذا أعتذر عن الكود الخاص بي. حتى الآن ، لم أتمكن من إخراج زوج مفتاح واحد فقط في الصفيف (آخر واحد) - على الرغم من خارج النموذج ، فإن الكود المستخدم في البرنامج التعليمي يعمل بالضبط. هذا من استخدام قليل على الرغم من! المضيف هو النموذج الذي يتمثل فيه النموذج الرئيسي ، والفواتير هو النموذج الخارجي الذي أحاول إضافته إلى النموذج.

هذا هو الرمز الذي يعمل خارج النموذج من البرنامج التعليمي:

<% for billing in @billings -%>
<%= check_box_tag('billing_title[]', billing.id, @host.billings.collect
{|obj| obj.id}.include?(billing.id))%> <%= billing.title %><br />
<% end -%>

أنا فقط بحاجة إلى معرفة كيفية جعلها تعمل داخل النموذج. هذا هو الكود المذكور أعلاه الذي يسترجع فقط آخر مجموعة Keypair بعد حلقاتها:

<% f.fields_for :billings do |obj| %><br />
<%= check_box_tag('billing_title[]', billing.id, @billings.collect
{|obj| obj.id}.include?(billing.id))%> <%= billing.title %><br />
<% end %>

التصحيح (billings):

--- 
- !ruby/object:Billing 
attributes: 
title: Every Month
id: "1"
attributes_cache: {}

- !ruby/object:Billing 
attributes: 
title: 12 Months
id: "2"
attributes_cache: {}

- !ruby/object:Billing 
attributes: 
title: 6 Months
id: "5"
attributes_cache: {}

أي مساعدة حقا موضع تقدير.

هل كانت مفيدة؟

المحلول

كريج ، يبدو أن ما تبحث عنه هو قبول_nted_attributes_for وهو وسيلة أفضل بكثير للتعامل مع النماذج المتداخلة في شكل ما.

بدلاً من مجرد سرقة جميع أعمال ريان وأعيد نشرها هنا ، سأعطيك رابطًا إلى شاشةه:

http://railscasts.com/episodes/196-nested-model-form-bart-1

هذا يعتمد على سلسلة أشكاله المعقدة.

يجب أن تكون قادرًا على تايلور هذا البرنامج التعليمي لما تحاول القيام به ، ولكن إذا لم أكن سعيدًا بالمساعدة.

تعديل:

حسنًا ، بعد النظر إلى الكود الخاص بك ، هناك بعض الأشياء التي تسبب لك مشاكل. قون

بادئ ذي بدء ، مع الجمعيات ، لا تحتاج إلى سحب مجموعة إضافية للفواتير ، أي:

@host = Host.find(params[:id])
@voips = Voip.find(:all)
@custsupps = Custsupp.find(:all)
@payments = Payment.find(:all)
@billings = Billing.find(:all) # <-- This is not needed and causing your problems

إعداد الارتباط في النموذج يفعل كل شيء من أجلك. هذا جزء من سحر القضبان. :د

الآن ، من المهم أن نلاحظ أنه عند استخدام الجمعيات ، تحتاج إلى التأكد من أن الكائنات مرتبطة بالفعل. بمعنى آخر ، إذا كان لديك 3 كائنات من الفواتير في قاعدة البيانات الخاصة بك ولم ترتبط بكائن المضيف الخاص بك ، فلن تظهر في النموذج.

إذا كنت تحاول ربط فواتير إلى مضيف باستخدام خانة اختيار ، فأنت تريد اتباع نهج مختلف ، لأن النموذج الخاص بك مع فواتير العرض فقط مرتبط بالفعل مع مضيفك.

إذا كنت تحاول فقط تحرير أو تعديل الفواتير الحالية المرتبطة بالمضيف ، حيث يمثل مربع الاختيار سمة "مدفوعة" (منطقية) على سبيل المثال ، فإن هذا النهج جيدًا وسيبدو رمز النموذج الخاص بك مثل هذا:

<% f.fields_for :billings do |b| %><br />
  <%= b.check_box :paid %> <%= b.title %>
<% end %>

لذلك ربما توضح ما تحاول تحقيقه من وجهة نظر الوظيفة ويمكننا إيجاد حل أفضل.

نصائح أخرى

لست متأكدًا من إجابتي ، لكنني سأحاول ...

<% f.fields_for :billings, @billings do |obj| %>
   # ...
<% end %>

يبدو لي وكأنها مشكلة في الحلقات ...

في رمز المثال الخاص بك ، أنت تحلق من خلال @billings (مجموعة من كائنات Billings التي تم تمريرها من وحدة التحكم الخاصة بك) ، وتدعو إلى الكائنات الحالية billing.

في رمز النموذج الخاص بك ، أنت تحلق من خلال :billings (الرمز الذي يشير إلى Billings ActivereCords) واتصل بالذات الحالية obj. ثم ، بشكل مربك ، يعيد الكود الخاص بك استخدام الاسم المتغير obj مرة أخرى في وظيفة @billings.collect ... ولكن يجب أن يكون لهذا النطاق الخاص المحلي ولا يؤثر على حلقةك الرئيسية ، ولكن من الصعب تفسيرها على مرأى.

على أي حال ، نظرًا لأن الأشياء الموجودة داخل حلقة النموذج لا تشير obj, ، إنه يستخدم المتغير billing-الذي لا يتغير عند حلقة ، ولكنه يحتفظ بالقيمة الأخيرة التي كانت لها: العنصر الأخير من الحلقة السابقة! هذا ما يفسر لماذا ترى العلامة الأخيرة فقط. (أيضا ، debug(@billings) تعمل الوظيفة على حلقة خاصة بها من خلال السجلات من نوع ما-فهي ليست داخل حلقة الحقول.

سأبدأ بتغيير السطر الأول من رمز النموذج الخاص بك لإعادة استخدام الاسم المتغير billing مرة أخرى ، مثل هذا:

<% f.fields_for :billings do |billing| %><br />

بناء جملة كتلة روبي يمكن أن تكون مربكًا للغاية في البداية-أو ، في أي وقت تقرأ فيه رمزًا لم تكتبه بنفسك-ولكن عندما تقسمها جميعًا إلى المكونات الأساسية ، فإنها عادة ما تكون مجرد حلق من خلال مجموعة من العناصر وأداء بعضها وظيفة على كل واحد. احترس أيضًا من الالتباس بين الأسماء المماثلة: billing ، billings ،: الفواتير والفواتير كلها أشياء مختلفة لروبي وقضبان. حظا طيبا وفقك الله!

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top