gorilla/schema 和 mgo/bson.ObjectId
gorilla/schema and mgo/bson.ObjectId
这是一个先有鸡还是先有蛋的问题。
在 HTML 模板中,表单 bson.ObjectId 需要使用 {{mytype.Id.Hex()}}
呈现
例如
<form method="post">
<input name="id" value="{{mytype.Id.Hex()}}>
</form>
在 Go 中定义一个应该由 gorilla/schema
解析的结构时
type MyType struct {
Id bson.ObjectId `bson:"_id,omitempty" schema:"id"`
}
当您调用(从模式)时decoder.Decode(instance_of_mytype, r.PostForm)
它 "throws" 一个错误:schema: invalid path "id"
因为格式只是 bson.ObjectId 的字符串表示而不是实际的 bson.ObjectId.
我想知道除了手动填写字段 (r.FormValue()
) 以使其工作之外我还能做什么。
我应该用 gorilla/schema 或 mgo 创建一个问题还是我应该手动做?
您可以定义自己的基于字符串的类型,它保存值的十六进制表示,并在其上实现 bson.Getter and bson.Setter 接口。 Gorilla会忽略这些接口而使用字符串值,bson会忽略字符串值而使用接口。
类似的东西(未经测试的代码):
type hexId string
func (id hexId) GetBSON() (interface{}, error) {
return bson.ObjectIdHex(string(id)), nil
}
func (id *hexId) SetBSON(raw bson.Raw) error {
var objId bson.ObjectId
err := raw.Unmarshal(&objId)
if err != nil {
return err
}
*id = hexId(objId.Hex())
return nil
}
这是一个先有鸡还是先有蛋的问题。
在 HTML 模板中,表单 bson.ObjectId 需要使用 {{mytype.Id.Hex()}}
例如
<form method="post">
<input name="id" value="{{mytype.Id.Hex()}}>
</form>
在 Go 中定义一个应该由 gorilla/schema
解析的结构时type MyType struct {
Id bson.ObjectId `bson:"_id,omitempty" schema:"id"`
}
当您调用(从模式)时decoder.Decode(instance_of_mytype, r.PostForm)
它 "throws" 一个错误:schema: invalid path "id"
因为格式只是 bson.ObjectId 的字符串表示而不是实际的 bson.ObjectId.
我想知道除了手动填写字段 (r.FormValue()
) 以使其工作之外我还能做什么。
我应该用 gorilla/schema 或 mgo 创建一个问题还是我应该手动做?
您可以定义自己的基于字符串的类型,它保存值的十六进制表示,并在其上实现 bson.Getter and bson.Setter 接口。 Gorilla会忽略这些接口而使用字符串值,bson会忽略字符串值而使用接口。
类似的东西(未经测试的代码):
type hexId string
func (id hexId) GetBSON() (interface{}, error) {
return bson.ObjectIdHex(string(id)), nil
}
func (id *hexId) SetBSON(raw bson.Raw) error {
var objId bson.ObjectId
err := raw.Unmarshal(&objId)
if err != nil {
return err
}
*id = hexId(objId.Hex())
return nil
}