【问题标题】:gorilla/schema and mgo/bson.ObjectIdgorilla/schema 和 mgo/bson.ObjectId
【发布时间】:2015-02-11 20:16:09
【问题描述】:

这是一个先有鸡还是先有蛋的问题。

在 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) 它“抛出”一个错误:schema: invalid path "id",因为格式只是 bson.ObjectId 的字符串表示,而不是实际的 bson.ObjectId。

我想知道除了手动填写字段 (r.FormValue()) 之外我还能做什么。

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

【问题讨论】:

    标签: mgo gorilla


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-05-14
      • 1970-01-01
      • 2013-10-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-16
      • 2014-08-30
      相关资源
      最近更新 更多