无法将项目添加到数据库

Posted

技术标签:

【中文标题】无法将项目添加到数据库【英文标题】:Not able to add Items to Database 【发布时间】:2019-12-31 14:49:34 【问题描述】:

// 这是我在 youtube 上 Paul Hudson 的教程中提出的问题的延续 -

我尝试将项目添加到数据库(见下图)-

当我点击上图中的“添加”按钮时,这些框应该变成空的(见下图)。虽然.Quantum Pizza不会被添加到.Statin Island Pizza和.Country Pizza的列表中,因为我没有做进一步的编码),但应该如下图-

但是,结果如下——

现在,我正在发布代码 -----

configure.swift -

import  Fluent
import FluentSQLite
import Vapor
import Leaf // added

public func configure(_ config: inout Config, _ env: inout Environment, _ services: inout Services) throws 
    // Register routes to the router
    let router = EngineRouter.default()
    try routes(router)
    services.register(router, as: Router.self)

    let leafProvider = LeafProvider()    // added
    try services.register(leafProvider)  // added
    config.prefer(LeafRenderer.self, for: ViewRenderer.self)// added

    let directoryConfig = DirectoryConfig.detect()
    services.register(directoryConfig)
    try services.register(FluentSQLiteProvider())
    var databaseConfig = DatabasesConfig()
    let db = try SQLiteDatabase(storage: .file(path:"\(directoryConfig.workDir)pizza.db"))

    databaseConfig.add(database: db, as: .sqlite)
    services.register(databaseConfig)

    var migrationConfig = MigrationConfig()
    migrationConfig.add(model: Pizza.self, database: .sqlite)
    services.register(migrationConfig)
    let serverConfigure = NioserverConfig.default(hostname: "0.0.0.0", port: 9090)
    services.register(serverConfigure)

routes.swift -

import Routing
import Vapor
import FluentSQLite

public func routes(_ router: Router) throws 
    router.get  req -> Future <View> in
        let Newyorker = Pizza(id: 5, name: "Statin Island Pizza", description: "Impractical Jokers Funny Pizza", price: 55)
        let Traditional = Pizza(id: 5, name: "Country Pizza ", description: "Johny Cash Special", price: 55)

        return try req.view().render("welcome",["pizza":[Newyorker,Traditional]])
    

    router.post(Pizza.self, at: "add")  req, pizza -> Future<Response> in
        return pizza.save(on:req).map(to:Response.self)  Pizza in
            return req.redirect(to: "/")
        
    

pizza.swift -

import Foundation
import Vapor
import FluentSQLite

struct Pizza: Encodable, Content, Decodable, SQLiteModel, Migration 
    var id:  Int?
    var name: String
    var description: String
    var price: Int

叶子截图(我试图以正确的格式粘贴代码,但不能。所以添加截图)-

编辑1:点击添加按钮后的截图-

如果您需要,我很乐意为您提供任何进一步的信息。 另外,我想知道我的问题的标题是否应该修改或应该添加任何内容。谢谢。

【问题讨论】:

是这条线吗? router.post(Pizza.self, at: "add") /add 在您的 routes.swift 中而不是 add 恐怕不是。你的意思是我猜的叶子文件。无论如何,我尝试了叶子文件中“/add”和“add”的所有组合以及routes.swift,但没有成功。我错过了什么? 现在,它又显示了一个错误,我在上面粘贴了屏幕截图(编辑 2)。 【参考方案1】:

您的表单操作应为 action="add"(您缺少结束操作的结束引号)

【讨论】:

我可以给你看教程的截图。这是我写它的方式。教程的链接是 - youtube.com/watch?v=pSgWwyj1gX4。见第 43 分钟。 您提供的 Leaf 文件的屏幕截图缺少 " - 屏幕截图有误吗? 是的,我的错,应该是 -
,但它也不起作用。
该更改指向哪个网址? 当我点击添加按钮时,它会显示在地址栏中 - "localhost:9090/%E2%80%9C/…" 。我从地址栏中复制并粘贴,但它与我复制的内容不同。它以某种方式发生了变化,因此在我单击“添加”按钮后粘贴屏幕截图。请参阅我的主要问题中的编辑 1。【参考方案2】:

基于 OxTim 的回答 - 它是。一个简单的叶子格式/反逗号问题。

正确的叶子格式 -

 <! DOCTYPE html>
 <html>
  <body>
 <h1> Pizza </h1>
 <p> Welcome to best pizza in the Andromeda Galaxy.
  <ul>
  #for(pizza in pizza) 
  <li> #(pizza.name) </li>

 </ul>

 <form method="post" action="/add">
<p>Name: <input type="text" name="name" /></p
<p>Description: <input type="text" name="description" /></p>
 <p>Price: <input type="number" name="price" /></p>
 <button type="submit">Add</button>
 </form>

【讨论】:

以上是关于无法将项目添加到数据库的主要内容,如果未能解决你的问题,请参考以下文章

将核心数据添加到我的项目时无法添加 sql 文件

无法将核心数据文件添加到我现有的项目(版本控制问题)...?

无法手动将项目添加到通过列表迭代填充的列表框

使用 AJAX 将项目添加到 Laravel 中的数据库,然后显示项目

在 Android 中加载动态项目时无法将页脚视图添加到列表视图

Entity Framework 6 将存储过程添加到数据模型后无法构建