Граали динамическая радиогруппа


У меня есть требование к приложению 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 2

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