Как передать данные из шаблона листа POST/form?

У меня есть несколько серьезных пробелов в моем понимании пара/листа/html. Я работаю с примером «todo», созданным с использованием бета-ветви пара.

Во-первых, я сделал свою собственную беглую модель (без проблем, о которых я знаю):

import FluentSQLite
import Vapor
final class affordatmodel: SQLiteModel {
    var id: Int?
    var propertyCost: String
    var targetEquity: String
    var interestRate: String
    var amortization: String
    var sponsor1: String
    var sponsor2: String
    var rent: String
    var rentInflation: String
    var propertyTaxes: String
    var propertyTaxesInflation: String
    var strataFees: String
    var strataFeesInflation: String
    init(propertyCost: String, targetEquity: String, interestRate: String, amortization: String, sponsor1: String, sponsor2: String, rent: String, rentInflation: String, propertyTaxes: String, propertyTaxesInflation: String, strataFees: String, strataFeesInflation: String) {
        self.propertyCost = propertyCost
        self.targetEquity = targetEquity
        self.interestRate = interestRate
        self.amortization = amortization
        self.sponsor1 = sponsor1
        self.sponsor2 = sponsor2
        self.rent = rent
        self.rentInflation = rentInflation
        self.propertyTaxes = propertyTaxes
        self.propertyTaxesInflation = propertyTaxesInflation
        self.strataFees = strataFees
        self.strataFeesInflation = strataFeesInflation
    }
}
/// Allows to be used as a dynamic migration.
extension affordatmodel: Migration { }
/// Allows to be encoded to and decoded from HTTP messages.
extension affordatmodel: Content { }
/// Allows to be used as a dynamic parameter in route definitions.
extension affordatmodel: Parameter { }

Затем я создаю экземпляр и отправляю его в листовой шаблон:

let defaultData = affordatmodel(propertyCost: "700000", targetEquity: "300000", interestRate: "1", amortization: "20", sponsor1: "500000", sponsor2: "200000", rent: "1200", rentInflation: "1", propertyTaxes: "8000", propertyTaxesInflation: "1", strataFees: "0", strataFeesInflation: "0")
return leaf.render("welcome", ["affordat": defaultData])

И мой шаблон Leaf успешно заполняет html данными по умолчанию (тело показано здесь):

<body class="container">
    <h1>Payment and Principal Calculations</h1>

    <form action="/affordat" method="POST">
        <div class="form-group">
            <label for="propertyCost">Property Cost</label>
            <input type="number" class="form-control" name="propertyCost" placeholder="#(affordat.propertyCost)">
                </div>
        <div class="form-group">
            <label for="targetEquity">Target Equity</label>
            <input type="number" class="form-control" name="targetEquity" placeholder="#(affordat.targetEquity)">
                </div>
        <div class="form-group">
            <label for="interestRate">Interest Rate</label>
            <input type="number" class="form-control" name="interestRate" placeholder="#(affordat.interestRate)">
                </div>
        <div class="form-group">
            <label for="amortization">Amortization (years)</label>
            <input type="number" class="form-control" name="amortization" placeholder="#(affordat.amortization)">
                </div>
        <div class="form-group">
            <label for="sponsor1">Sponsor 1 Funds</label>
            <input type="number" class="form-control" name="sponsor1" placeholder="#(affordat.sponsor1)">
                </div>
        <div class="form-group">
            <label for="sponsor2">Sponsor 2 Funds</label>
            <input type="number" class="form-control" name="sponsor2" placeholder="#(affordat.sponsor2)">
                </div>
        <div class="form-group">
            <label for="rent">Rent</label>
            <input type="number" class="form-control" name="rent" placeholder="#(affordat.rent)">
                </div>
        <div class="form-group">
            <label for="rentInflation">Rent Inflation (will be used exactly)</label>
            <input type="number" class="form-control" name="rentInflation" placeholder="#(affordat.rentInflation)">
                </div>
        <div class="form-group">
            <label for="propertyTaxes">Property Taxes (first year est.)</label>
            <input type="number" class="form-control" name="propertyTaxes" placeholder="#(affordat.propertyTaxes)">
                </div>
        <div class="form-group">
            <label for="propertyTaxesInflation">Property Taxes Inflation (est.)</label>
            <input type="number" class="form-control" name="propertyTaxesInflation" placeholder="#(affordat.propertyTaxesInflation)">
                </div>
        <div class="form-group">
            <label for="strataFees">Strata Fees (first year est.)</label>
            <input type="number" class="form-control" name="strataFees" placeholder="#(affordat.strataFees)">
                </div>
        <div class="form-group">
            <label for="strataFeesInflation">Strata Fees Inflation (est.)</label>
            <input type="number" class="form-control" name="strataFeesInflation" placeholder="#(affordat.strataFeesInflation)">
                </div>

        <input type="hidden" name="_csrf" value="{{csrfToken}}">
            <button type="submit" class="btn btn-primary">Refresh Calculations</button>
            </form>

</body>

Отлично, теперь я знаю, как перевести данные в HTML. Моя проблема в том, что я не знаю, как его вернуть. Когда происходит «Post», данные, похоже, не передаются контроллеру. Мой маршрут:

router.post("affordat", use: affordatController.create)

И соответствующая часть моего контроллера выглядит так:

import Vapor
final class AffordatController {
    func create(_ req: Request) throws -> Future<affordatmodel> {
        return try req.content.decode(affordatmodel.self).flatMap(to: affordatmodel.self) { affordatmodel1 in
            return affordatmodel1.save(on: req)
        }
    }
}

Который показывает мне одну из моих моделей с идентификатором №, но без данных. И я как бы понимаю, почему, потому что на самом деле я не отправлял данные поста в контроллер. Как я должен отправлять данные POST на контроллер? Является ли проблема в моем конечном шаблоне, моем маршруте или моем контроллере?


person Narwhal    schedule 01.04.2018    source источник
comment
Привет. Существует множество способов отправки данных POST. Во-первых, убедитесь, что метод, который вы используете. данные формы/x-www-form-urlencoded/raw/json? Я предлагаю скачать Postman (бесплатное и очень полезное приложение), вы сможете убедиться в правильности запроса и даже провести некоторые унитарные тесты. Итак, как вы отправляете свои данные?   -  person Martin    schedule 04.04.2018
comment
Привет Мартин. Я отправляю его из шаблона Leaf, показанного выше, который вызывает доступ к маршруту, который направляется к контроллеру, используя этот маршрут: router.post(affordat, use: доступ к контроллеру.создать), но у меня нет доказательств того, что данные попадают туда, потому что контроллер возвращает {id:1,sponsor2:,interestRate:,strataFees:,propertyTaxesInflation:,targetEquity:,rent:,propertyTaxes:,rentInflation:,amortization:,strataFeesInflation:,sponsor1:,propertyCost:} (т. е. сохранена пустая модель )   -  person Narwhal    schedule 04.04.2018


Ответы (1)


Похоже, это должно сработать. Вы можете проверить данные, отправляемые на ваш сервер, в инспекторе сети в вашем браузере. Убедитесь, что вы сохранили журналы, и вы сможете увидеть запрос POST и данные, отправленные на сервер.

Если вы ставите точку останова в каждой точке запроса, вы можете увидеть, что это за данные.

Кроме того, похоже, что вы отправляете пустую форму, поэтому она просто заполняет все пустыми строками. Вы хотите использовать value вместо placeholder во входных данных формы? Значение будет предварительно заполнять данные для пользователя, заполнитель покажет значение пользователю в качестве предложения, но не отправит данные при отправке формы.

person 0xTim    schedule 16.08.2019