Граали динамическая радиогруппа
У меня есть требование к приложению grails для отображения списка вопросов на экране с 6 вариантами оценки, перечисленными ниже каждого из вопросов. Информация для этих вопросов и оценок поступает из таблицы подстановки в базе данных. У меня есть вопросы и оценки, отображаемые на экране, но я не знаю, как получить информацию о поиске, чтобы сохранить ее в базе данных. Я также хотел бы знать, есть ли способ выбрать определенную оценку по умолчанию для каждого из них. вопрос. Я попробовал проверить= "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, поэтому любая помощь или примеры, на которые вы могли бы указать мне, были бы великолепны. Спасибо!
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>
Это не требует, чтобы вы писали внутренний каждый. В основном вы передаете массив меток и параллельный массив значений. Значение атрибута является значением по умолчанию, значения атрибутов. Внутреннее тело радиогруппы будет повторяться для каждой пары меток и значений. Этот *. (aka spread operator) в основном то же самое, что и использование метода collect ().
Я удалил оператор спреда для метки и я передал полный объект в для метки. Тогда внутри тела тега, когда я делаю
it.label
, у меня есть полный объект и я могу использовать различные поляit.label.description
иit.label.grade
.Что касается установки по умолчанию значения grade S. вам нужно будет написать код, чтобы найти grade S из
evalQuestion.areaOfEval.grades
. Что-то вроде: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">