gorilla / schema和mgo / bson.ObjectId

时间:2015-02-11 02:29:01

标签: mgo gorilla

这里有点鸡蛋和鸡蛋的问题。

在HTML模板中,需要使用{{mytype.Id.Hex()}}

呈现表单bson.ObjectId

e.g。

<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) 它&#34;抛出&#34;错误:schema: invalid path "id"因为格式只是bson.ObjectId的字符串respresentation而不是实际的bson.ObjectId。

我想知道除了手动填充字段(r.FormValue())以使其工作之外我能做些什么。

我应该使用gorilla / schema或mgo创建问题,还是应该手动执行?

1 个答案:

答案 0 :(得分:0)

您可以定义自己的基于字符串的类型,该类型包含值的十六进制表示,并在其上实现bson.Getterbson.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
}