我要求grails应用程序在屏幕上显示问题列表,每个问题下面列出了6个等级选项。这些问题和成绩的信息来自数据库中的查找表。我有问题和成绩显示在屏幕上,但我不知道如何获取查找信息以保存在数据库中。我还想知道是否有办法在每个问题上默认选择某个等级。我尝试了checked =“S”,但这只选择最低级问题的S等级。
我的视图代码是
<label for="questions"></label>
<ul class="one-to-many">
<!-- Evaluation Questions -->
<g:each in="${cdeEvaluationInstance?.questions}" var="evalQuestion" status="i">
<g:hiddenField name="cdeEvaluation.questions[${i}].id" value="${evalQuestion.id}"/>
<legend>
${evalQuestion.areaOfEval.title}
</legend>
<p>
<strong>Focus areas: ${evalQuestion.areaOfEval.focusArea}</strong>
</p>
<p>
<em> ${evalQuestion.areaOfEval.description}
</em>
</p>
<p>
<g:each in="${evalQuestion.areaOfEval.grades.sort{it.grade}}"
var="grade" ><div class="radio">
<span class="clear long">
<input type="radio"
name="radioGroup" value="${evalQuestion.grade}" checked="S" />
<label class="long"><strong> ${grade.grade}
</strong> ${grade.description}</label>
</div>
</g:each>
我的控制器代码是
def evalQuestions = EvaluationService.fetchActiveEvaluationQuestions();
//def evaluation = new CdeEvaluation(questions: evalQuestions)
def evaluation = new CdeEvaluation(params)
evaluation.setQuestions(evalQuestions)
表格中的问题和答案
package gov.mt.mdt.cde.domain.evaluation
import java.util.Date;
class CdeEvalQuestion extends Base{
CdeAreaOfEvaluation areaOfEval
CdeAreaOfEvalCriteria grade
String comments
static belongsTo = [cdeEvaluation: CdeEvaluation]
static mapping = {
id column: 'cevqu_id_seq'
id generator: 'sequence', params: [sequence: 'cevqu_id_seq']
areaOfEval column: 'caoe_id_seq'
grade column: 'caoec_id_seq'
}
static constraints = {
comments(blank:true, nullable:true, maxSize:2000)
createdBy(blank: false, nullable:false, maxSize:13)
dateCreated(blank: false, nullable:false)
lastUpdatedBy(blank: false, nullable:true, maxSize:13)
lastUpdated(blank: false, nullable:true)
}
}
我刚刚开始学习grails / groovy,所以你可以指出我的任何帮助或例子都会很棒。谢谢!
答案 0 :(得分:1)
因此,默认情况下选择一个特定的问题,您可以执行以下操作:
<g:radioGroup name="myGroup" labels="evalQuestion.areaOfEval.grades" values="evalQuestion.areaOfEval.grades*.grade" value="evalQuestion.grade">
${it.radio} <label class="long"><strong>${it.label.grade}</strong> ${it.label.description}</label>
</g:radioGroup>
这不需要你写每个内部。基本上你传递一组标签和一个并行的值数组。 value属性是values属性的默认值。对于每个标签和值对,将重复radioGroup的内部主体。 *。 (aka spread operator)与使用collect()方法基本相同。
我删除了标签的扩展运算符,并将完整的对象传递给标签。然后当我执行it.label
时,我会在标记的正文内部使用完整的对象,并且可以使用不同的字段it.label.description
和it.label.grade
。
至于将默认值设置为等级S.您需要编写代码以从evalQuestion.areaOfEval.grades
中找到等级S.类似的东西:
evalQuestion.areaOfEval.grades.find { it.grade == 'S' }
并将其传递给标签的value属性。你可以这样做:
<g:set var="defaultGrade" value="evalQuestion.areaOfEval.grades.find { it.grade == 'S' }"/>
<g:radioGroup name="myGroup"
labels="evalQuestion.areaOfEval.grades"
values="evalQuestion.areaOfEval.grades*.grade"
value="defaultGrade">