سؤال

لدي رمز form_for

<%form_for :a,:url=>{:controller=>"biz/a",:action=>"save"},:html =>{:multipart => true} do |f| %>
.....
<%f.fields_for :b do |b|%>
.....
<%b.fields_for :apples  do |apple|%>
...
<%end%>
....
<%end%>

يقوم بإخراج رمز HTML بدون وظيفة Fields_For

<textarea cols="40" id="a_b_apples_content" name="a[b][apples][content]" rows="20" style="width:500px;height:100px;border:1px #889BAA solid;color:#999;font-size:12px;padding:6px;"></textarea>

عندما أقوم بتغيير form_for إلى:

<%form_for @a,:url=>{:controller=>"biz/a",:action=>"save"},:html =>{:multipart => true} do |f| %>

انها تعمل بشكل جيد. ويخرج:

<textarea cols="40" id="a_b_apples_content" name="a[b_attributes][apples_attributes][0][content]" rows="20" style="width:500px;height:100px;border:1px #889BAA solid;color:#999;font-size:12px;padding:6px;"></textarea>

كما أريد. لماذا لا يعمل الرمز في form_for بشكل جيد؟ ما الفرق بين: A و A in Form_for. شكرًا. يمكنني استخدام Rails 2.3.8 ، Ruby 1.8.7 ، متصفح الويب Chrome.

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

المحلول

هذا هو مصدر مشترك للإحباط. form_for في الواقع يتصرف بشكل مختلف بناءً على ما إذا كنت تمرر رمزًا أو كائنًا. إذا قمت بتمريره رمزًا ، مثل ذلك:

<% form_for :person do |f| %>
  <% f.text_field :name %>
<% end %>

بعد ذلك ، سيعمل منشئ النماذج ، لكنه سيقوم فقط بإعداد قيم Param ، وتحميل القيم الافتراضية في حالة وجود person. سيبدو تجزئة parmas الخاص بك كما ينبغي:

params = {
  :person => {
    :name => 'bob'
  }
}

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

بصراحة ، لا أستطيع أن أخبرك لماذا يتصرفون بشكل مختلف. من الواضح أن إصدار الرمز لا يزال لديه إمكانية الوصول إلى متغير المثيل (person في المثال أعلاه) لأن الحقول سيتم ملؤها بقيمها الحالية. الحل السهل هو أن تمرير متغير مثيل هو دائمًا الطريق ، وسيعمل بشكل صحيح.

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