Vapor4.0发送Post及Leaf渲染

今天填了两个坑。

1, Post 创建文章。Article database Model结构为:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
final class Article: Model, Content {
static var schema: String = "articles"
static var idKey: FieldKey = .id
static var nameKey: FieldKey = "name"
static var slugKey: FieldKey = "slug"
static var bodyKey: FieldKey = "body"
static var categoryIDKey: FieldKey = "category_id"
static var createdKey: FieldKey = "created_at"
static var updatedKey: FieldKey = "updated_at"

@ID(key: idKey)
var id: UUID?

@Field(key: nameKey)
var name: String

@Field(key: slugKey)
var slug: String?

@Field(key: bodyKey)
var body: String

@OptionalParent(key: categoryIDKey)
var category: ArticleCategory?

@Timestamp(key: createdKey, on: .create)
var createdAt: Date?

@Timestamp(key: updatedKey, on: .update)
var updatedAt: Date?

init() {
}
init(name: String, body:String, categoryID: UUID? = nil) {
self.name = name
self.body = body
self.$category.id = categoryID
self.slug = "\(Date().formatedString())\(name.split(separator: " ").joined(separator: "-"))"
}

}

Article database model中, 我创建了一个父关系category, 但这个项目中,我并不打算让每篇文章都有一个类别,所以我把父关系设置为可选类型。但是post的时候并不能把category这个字段省略,请求的格式必须这样:

1
2
3
4
5
{
"body": "Hello, my first blog.",
"category": {},//或者 "category": { "id": null },
"name": "my first blog"
}

是不是很不合理?前端拿到这个API会比较迷惑,组建json的时候,这个字段没有值,不能不写这个key-value pair, 也不能写成category:null 。社区中大神给出的方案是用一个不含category字段的结构体先接收,然后再转成database mode的样子。具体解释请参考这里

2, Leaf渲染。Vapor4的文档还没有出,Leaf的定义也与Vapor3有很大的改变,这就难为死我了。这种情况下,只能去扒一扒Test里面写的测试用例了。坑如下:

1
2
3
4
5
6
7
8
9
<p>#(title)</p>
#if(!articles.isEmpty):
<p>#(title)</p>
#for(article in articles):
<p>#(article)</p>
#endfor
#else:
<p>no artcile</p>
#endif

遍历打印文章是打印不到的。必须是打印文章的属性,如下写法是正确的:

1
2
3
4
5
6
7
8
9
<p>#(title)</p>
#if(!articles.isEmpty):
<p>#(title)</p>
#for(article in articles):
<p>#(article.name)</p>//<--注意这里
#endfor
#else:
<p>no artcile</p>
#endif

填坑完毕。