在一个视图中更新许多实例

时间:2013-04-23 00:49:30

标签: grails grails-controller

我从Grails开始,我不知道如何面对以下用例。

该应用程序是关于运动结果预测,所以我在我的域“匹配”和“预测”,我想有一个视图,用户可以更新尚未播放的匹配的所有预测。

到目前为止,我已经在我的“PredictionController”中定义了一个方法,该方法搜索所有已经存在的必须播放的游戏预测,并为日期高于现在的任何新匹配生成新的预测实例。我已经为该方法创建了一个视图,并且我正确地得到了我应该完成或更新的所有预测,并且我已经在我的控制器中定义了另一种形式sumbission的方法(所以我试图在“创建”和“更新”脚手架方法的工作方式相同。

我的问题是,如何访问我视图修改的所有预测?如何将所有预测发送到我的更新方法?它是否使用包含所有集合的变量定义隐藏字段?

这是我的GSP视图中的表单:

<g:form action="savePredicctions">
<fieldset>
<g:each in="${predictions}">
    <li>
    <div>
        ${it.match.homeTeam}
        <g:field name="${it.match}.homeGoals" type="number" value="${it.homeGoals}" />
    </div>
    -
    <div> 
        <g:field name="${it.match}.awayGoals" type="number" value="${it.awayGoals}" /> 
        ${it.match.awayTeam}
    </div>                  
    </li>
</g:each>
</fieldset>
<fieldset class="submit">
    <g:submitButton />
</fieldset>
</g:form>

1 个答案:

答案 0 :(得分:3)

您可以使用command对象存储预测实例。

@Validateable
class PredictionCommand {
  //data binding needs a non-null attribute, so we use ListUtils.lazyList
  List<Prediction> predictions = ListUtils.lazyList([], FactoryUtils.instantiateFactory(Prediction))

}

在您的视图中,您需要控制列表的索引,并将Prediction的属性发送到控制器:

<g:each in="${predictions}" status="i">
  <g:textField name="predictions[$i].homeGoals" />
  <g:textField name="predictions[$i].awayGoals" />
</g:each>

在您的控制器中,您可以使用bindData()params绑定到您的命令:

class CommandController {
  def save() {
    PredictionCommand command = new PredictionCommand()
    bindData(command, params)
    println command.predictions
  }
}