Проверка ввода формы в Revel

Я изучаю Revel и использую пакет Validation для проверки ввода. Я хочу увидеть, существует ли уже запись с «именем» в БД (я получаю ввод от пользователя через форму), и если истинная ошибка возврата, иначе создайте запись. Я могу проверить (с помощью встроенных методов, таких как Required, Maxlen ...) поле и отобразить ошибку в HTML. Но для моей пользовательской проверки. Добавляет пользовательский валидатор в пакет валидации, или есть способ добавить пользовательские ключи и ошибку в контекст валидации. Я не мог найти, как добавить пользовательские ключи и сообщение на карту ошибок. Спасибо.


person broun    schedule 09.06.2014    source источник
comment
ты пробовал читать мануал? revel.github.io/manual/validation.html Также может быть полезно подумайте, как закодированы валидаторы по умолчанию: github.com/revel/ revel / blob / Наконец, вы пытаетесь проверить ввод данных пользователем с помощью HTML-формы? Из вашего описания кажется неясным, как вы пытаетесь использовать функцию проверки Revel. Может быть, вы используете его не по назначению?   -  person Brenden    schedule 30.10.2014


Ответы (1)


Интерфейс revel validators.Validator выглядит так:

type Validator interface {
    IsSatisfied(interface{}) bool
    DefaultMessage() string
}

И у *validation.Validation есть метод:

func (v *Validation) Check(obj interface{}, checks ...Validator) *ValidationResult

И у *validation.ValidationResult есть метод:

func (*ValidationResult) Message

Собираем все вместе:

type usernameChecker struct {}

func(u usernameChecker) IsSatisified(i interface{}) bool {
    s, k := i.(string)

    if !k {
        return false
    }

    /* check if s exists in DB */
}

func(u usernameChecker) DefaultMessage() string {
    return "username already in use"
}

И в вашем приложении:

func (c MyApp) SaveUser(username string) revel.Result {
    c.Validation.Check(username, usernameChecker{}).Message("more specific or translated message in case of failure")
}

Это одна, если не самая плохо спроектированная библиотека проверки, которую я когда-либо видел.

person thwd    schedule 09.06.2014
comment
А, хорошо, я сделал что-то подобное, но попытался вызвать валидатор напрямую через Validation. Я проверю это, спасибо. Согласитесь, что эта библиотека проверки запутана, я ищу веб-фреймворки для Golang и обнаружил, что Revel и Martini являются основными. Есть ли у вас какое-либо мнение о них или предложения? - person broun; 10.06.2014
comment
Почему вы ищете фреймворки? Просто используйте net/http; Больше нечего вам предложить. - person thwd; 10.06.2014
comment
@tomwilde, если вы можете улучшить интерфейс проверки, то почему бы не внести его в Revel? Я уверен, что даже в его нынешней форме он даст желаемый результат с меньшим количеством строк кода по сравнению с мешаниной из if условий и тому подобного. - person Brenden; 30.10.2014
comment
@Brenden, зачем мне участвовать в проекте, с которым я не согласен? Я не предлагаю if-else как решение. Просто констатирую, что дизайн плохой. - person thwd; 30.10.2014
comment
@Zahrec: Я еще не нашел его. Может, напишу что-нибудь свое. Посмотрим. - person thwd; 22.07.2015
comment
@thwd у вас небольшая опечатка. должно быть IsSatisfied, а не IsSatisified. Я должен признать, что мне потребовалось слишком много времени, чтобы понять, что я делаю не так - person Eli DM; 28.05.2020