Как обрабатывать динамическое количество входных данных из html-формы с помощью Revel Golang

У меня есть html-форма с динамическим количеством входов. Каждый вход должен быть объектом модели, и у меня также есть функция, которая получает значения от этих входов. Моя html-форма:

<form action="{{url "Votes.CreateVote"}}" id="formVoteCreate" method="POST">
            <p class="field">
                <label>Question:</label>
                <input type="text" name="question" size="40"  />
            </p>
             <div ng-repeat="answer in answers">
                <p class="field">
                    <label>//stuff.title//:</label>
                    <input type="text" name=//stuff.name// size="40"  />
                </p>
             </div>
            <p>
                <input ng-click="addInput()" class="btn"  type="button" value="Add answer">
            </p>
            <p class="buttons">
                <input class="btn" type="submit" value="Create" />
            </p>
        </form>

И наслаждайтесь обработчиком golang:

func (c Votes) CreateVote() revel.Result {
   // in this place i want get a slice with answers from html form
   return c.Redirect(routes.App.Index())
}

и модель ответа:

type Answer struct {
  Model
  Text    string
}

Как я могу отправить значения формы в виде фрагмента с ответами, упакованными в модель?


person EgorkZe    schedule 07.03.2016    source источник


Ответы (1)


Каждый контроллер Revel поставляется с прикрепленной Request, которая на самом деле представляет собой обычную стандартную библиотеку Go Request. Таким образом, это то же самое, что и для простых веб-серверов Go, поскольку мы не можем использовать метод Request.Form.Get("inputname"), так как это даст только первый результат. Вместо этого нам нужно напрямую обращаться к значениям на карте Form:

package controllers

import (
    "log"

    "github.com/robfig/revel"
)

type App struct {
    *revel.Controller
}

func (c App) Index() revel.Result {
    if err := c.Request.ParseForm(); err != nil {
        // handle error
    }
    values := c.Request.Form["text"]
    for i := range values {
        log.Println(values[i])
    }
    return c.Render()
}

Приведенный выше пример предназначен для простого приложения, подобного тому, которое создается Revel при запуске проекта, с входными данными с именем text, и его можно адаптировать к вашему конкретному случаю.

Переменная values имеет тип []string, поэтому следующее регистрируется, если вы отправляете запрос GET со строкой запроса ?text=value1&text=value2&text=value3, как это произошло бы для формы с method="GET" и тремя текстовыми входами с name="text":

2016/03/07 22:16:41 app.go:19: value1
2016/03/07 22:16:41 app.go:19: value2
2016/03/07 22:16:41 app.go:19: value3

Форма в вопросе использует метод POST, но код для чтения значений из формы остается прежним.

person Herman Schaaf    schedule 07.03.2016