문제

목록이 있습니다 Team an Integer seed 재산. 나는 모든 팀의 씨앗을 한 번에 단일 형태로 편집하고 싶습니다. 나는 확실한 그 성배는 색인화 된 매개 변수를 지원하지만 작동하지는 않습니다.

여기에 내가 가진 것이 있고 효과가 있지만 나는 점프하고 있습니다. 방법 너무 많은 후프와 더 나은 방법이 있어야합니다.

GSP :

<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> 속성과 그것은 단지 작동합니다. 나는 성배에서 더 기대하지 않습니다! ;-)

도움을 주셔서 감사합니다.

도움이 되었습니까?

해결책 2

나는 마침내 shenanigans없이 이것을하는 방법을 알아 냈습니다.

숨겨진 매개 변수를 잊고 시드 매개 변수에서 팀 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 이는 매개 변수 이름을 '. 다음 GSP를 사용하여이를 활용할 수 있습니다.

<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>

NB : 이름 속성에는 []가 없습니다. 컨트롤러는 이제 약간의 검은 성배 마법을 사용하여 매우 간단합니다.

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

첫 번째 작업 findAll 내부에 점으로 모든 매개 변수를 필터링합니다. 나머지는 행 ID를 고정하는지도의지도입니다. 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 Verison에서). 단일 값을 얻습니다.

     <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)
 } 

매개 변수가 목록이 아닌 설정된 경우 값을 빈 목록에 넣습니다. 매개 변수가 설정되고 목록이있는 경우 Plus 연산자는 모든 개별 값을 빈 목록에 추가합니다. 매개 변수가 설정되지 않으면 두 개의 빈 목록이 함께 추가되어 하나의 빈 목록이 생성됩니다.

이것이 도움이 될지 확실하지 않지만 다음과 같이 클로저를 사용할 수 있습니다.

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

이 출력 HTML에서 목록을 작성할 수 있습니다. 또는 양식을 작성하십시오.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top