0

ここでちょっとした鶏が先か卵が先かの問題です。

HTML テンプレートでは、フォーム bson.ObjectId をレンダリングする必要があります{{mytype.Id.Hex()}}

例えば

<form method="post">
<input name="id" value="{{mytype.Id.Hex()}}>
</form>

Go で、ゴリラ/スキーマによって解析されるはずの構造体を定義するとき

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())それを機能させる.

ゴリラ/スキーマまたは mgo で問題を作成する必要がありますか? それとも手動で作成する必要がありますか?

4

1 に答える 1

0

値の 16 進表現を保持する独自の文字列ベースの型を定義し、それに bson.Getterおよび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
}
于 2015-02-11T12:16:09.013 に答える