2010-11-18 5 views
1

Я хочу, чтобы было проверено одно из двух полей формы, представляющих логическое значение. Но для этого нет подходящего ограничения. nullable: false не работает.Как обеспечить булевское поле, которое будет установлено в Grails?

class Organisation { 

    Boolean selfInspecting 

    static constraints = { 
     selfInspecting(nullable: false) 
    } 

} 

Как проверить, проверено ли одно из двух полей?

ответ

2

Вы также можете проверить это в Контроллере, например.

if (params.checkBox1 != 'on' && params.checkBox2 != 'on') 
    flash.error = 'At least one value must be checked.' 
    return ... 
3

Возможно, самый простой способ - использовать форму, которая обеспечивает выделение значения. Лучшим решением является создание переключателей, а не флажков. Это будет прямо представлять ваше намерение.

+0

Кроме того, флажки представляют собой несколько булевых значений. В вашем примере я бы ожидал увидеть только один флажок или группу радиостанций с параметрами yes/no. Вы также можете установить selfInspecting = true | false в вашем домене, чтобы он имел значение по умолчанию, отличное от нуля, независимо от того, что. Или используйте примитивное логическое значение, которое по умолчанию имеет значение false. – Gregg

+0

Я хочу использовать радиокнопки, но я не хочу его выбирать, потому что пользователи могут случайно принять мой выбор. – deamon

1

Вы можете написать свой собственный валидатор.

что-то вроде

selfInspecting(validator: {val, obj -> /*test selfInspecting here*/}) 

EDIT - в ответ на другой ответ - вы можете справиться с этим на форме, но вы также должны обрабатывать его на сервере.

ДРУГОЙ РЕДАКТИРОВАНИЕ - В комментарии было предложено подтвердить одно из двух полей класса Domain. Это также легко выполнить с помощью специального валидатора. С подписью выше для пользовательского закрытия валидатора val является значением selfInspecting, а obj - экземпляром объекта домена. Таким образом, вы могли бы получить

{ val, obj -> 

    if (val == null) return false // if you want to ensure selfInspecting is not null 
    else return true 

    ... or ... 

    // if you want to check that at least 1 of two fields is not null 
    def oneOrTheOther = false 
    if (obj.field1 != null || obj.field2 != null) 
     oneOrTheOther = true 
    return oneOrTheOther 

} 
+0

Если вы установили selfInspecting в значение по умолчанию или используете примитивное логическое значение, нет необходимости в специальной проверке. – Gregg

+0

@gregg, контроллеры/код службы не могут (случайно) отклонить значение? – hvgotcodes

+0

Я полагаю, они могут, если использовать объект Boolean, а не примитив. Но это также может произойти после проверки, поэтому тестирование является ключевым здесь. ;) – Gregg