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
}