سؤال

لدي قائمة Team الكائنات التي لها Integer seed ملكية.أريد تعديل بذور جميع الفرق مرة واحدة، في نموذج واحد.أنا بالتأكيد أن Grails تدعم المعلمات المفهرسة، لكن لا يمكنني تشغيلها.

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

نظام الأفضليات المعمم:

<g:form action="setSeeds">
...
  <g:each in="${teams}" status="i" var="team">
    <input type="hidden" name="teams[${i}].id" value="${team.id}">
    <input type="text" size="2" name="teams[${i}].seed" value="${team.seed}">
  </g:each>
</g:form>

مراقب:

def setSeeds = {
  (0..<30).each { i ->
    def team = Team.get(Integer.parseInt(params["teams[${i}].id"]))
    team.seed = Integer.parseInt(params["teams[${i}].seed"])
  }
  redirect(action:list)
}

أليس هذا فظيعا؟الطريق الكثير من الضوضاء.كيف يمكنني أن أفعل شيئًا على غرار:

params.teams.each { t ->
  def team = Team.get(t.id)
  team.seed = t.seed
}

بمعنى كيف أقوم بتعيين المعلمات المسماة team[0].seed, team[0].id, team[1].seed, team[1].id إلى القائمة؟

في شرائط يمكنك فقط الحصول على List<Team> الملكية وسوف تعمل فقط.لا أتوقع أقل من Grails!؛-)

شكرا مقدما لمساعدتكم.

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

المحلول 2

وأنا برزت أخيرا كيفية القيام بذلك دون أي الاشكالات.

ونسيان المعلمة خفية ومجرد استخدام ID فريق في المعلمة البذور. في GSP:

<g:form action="setSeeds"> 
... 
  <g:each in="${teams}" var="team"> 
    <input type="text" size="2" name="teams.seeds.${team.id}"
      value="${team.seed}"> 
  </g:each> 
</g:form> 

وبعد ذلك، في وحدة تحكم:

params.teams.seeds.each { teamId, seed ->
  def team = Team.get(teamId.toInteger())
  team.seed = seed.toInteger()
  team.save()
}
redirect(action:list)

وتعمل مثل السحر.

نصائح أخرى

وparams هو أكثر من مجرد خريطة العادية، انها GrailsParameterMap أن يبني تلقائيا الهياكل الفرعية للخرائط على أساس تقسيم أسماء المعلمات التي كتبها ''. قد الاستفادة من ذلك عن طريق استخدام نظام الأفضليات المعمم التالي:

<g:form action="seed">
 <g:each in="${teams}" status="i" var="team">
   <input type="hidden" name="teams.${i}.id" value="${team.id}">
   <input type="text" size="2" name="teams.${i}.seed" value="${team.seed}">
  </g:each>
 <g:submitButton name="update" value="Update" />
</g:form>

ملحوظة: لا يوجد [] في سمات الاسم. وحدة تحكم الآن بسيطة جدا باستخدام بعض الأسود الكؤوس المقدسة السحر:

log.error "params = ${params}"
params.teams.findAll {k,v -> !k.contains(".")}.each { k,v ->
       bindData(Team.get(v.id), v)
}

ووfindAll العملية الأولى بتصفية كافة المعلمات مع نقطة الداخل. والباقي هو خريطة من الخرائط عقد معرف التوالي في k وid وseed في v.

وآمل أن يكون هذا يجيب عن سؤالك.

في عام 2015....تعمل Grails بشكل مختلف قليلاً الآن وقد تجد نفسك تصطدم بالسلاسل بدلاً من الخرائط الفرعية المتوقعة. لقد حصلت على شيء للعمل من خلال القيام به
شيء مثل..

params.nested.each{
               if(!it.getKey().contains('.')){
                 //to get a map rather than a string...    
                  params.nested[it.getKey()];
               }
           };

يحرر:بالمناسبة...

المدخلات التي لها نفس الاسم، مثل

  <input name="item.choice" type="checkbox" value="3" />
  < input name="item.choice" type="checkbox" value="4"/>

يتم وضعها في القائمة إذا تم تقديم أكثر من واحدة.فإذا تم التحقق من كلا الأمرين أعلاه

   <input name="item.choice" type="checkbox" value="3" checked />
   < input name="item.choice" type="checkbox" value="4" checked/>

سوف تحصل على قائمة.

ولكن إذا تم تحديد واحد فقط، فلن تحصل على قائمة (على الأقل في إصدار Grails الذي أستخدمه)، وستحصل على قيمة واحدة.

     <input name="item.choice" type="checkbox" value="3" checked />
     < input name="item.choice" type="checkbox" value="4" />

وهذا يعني في وحدة تحكم، إذا كنت سأفعل شيئا من هذا القبيل

  params['item.choice'].each{
          def item=Item.get(it)
  }

قد يحدث خطأ إذا تم إرسال عنصر واحد فقط.إحدى الطرق الرائعة للتغلب على هذا هي

 ([]+(params['item.choice']?:[])).each{
         def item=Item.get(it)
 } 

إذا تم تعيين المعلمة وليس قائمة، فإنه يضع القيمة في القائمة الفارغة؛إذا تم تعيين المعلمة وقائمة، فسيقوم عامل الجمع بإضافة جميع القيم الفردية إلى القائمة الفارغة؛إذا لم يتم تعيين المعلمة، فستضيف قائمتين فارغتين معًا، مما يؤدي إلى إنشاء قائمة فارغة واحدة.

ولست متأكدا إذا كان ذلك يساعد ولكن هل يمكن استخدام إغلاق معها مثل:

<g:each in="${teams}">
     <p>id: ${it.id}</p>
     <p>seed: ${it.seed}</p>
</g:each>

وربما كنت قد بناء قائمة من هذه instaed من إخراج أتش تي أم أل. أو بناء النموذج الخاص بك معها.

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