2015-11-14 35 views
-2

我有一个处理程序/控制器接受一个http请求。如何从控制器传递数据以形成朗朗?

func UpdateHandler(request *http.Request) { 
    ID := mux.Vars(request)["ID"] 
    UpdateForm.Save(ID,db) 
} 

然后我有一个表单,我想要处理数据并最终更新它。

type UpdateForm struct { 
    ID    string   `json:"type"` 
} 

func (UpdateForm) Save(db mongo.Database) { 
    id := ID 
    repository.Update(Id) 
} 

Go会打印undefined ID

我怎样才能做出来肯定形式获得来自控制器的价值?

回答

1

我认为它与处理程序无关,但代码不一致。这条线

UpdateForm.Save(ID,db) 

Save()需要两个参数,而原来的方法签名只需要一个单一的mongo.Database类型参数的方法。

以下是我认为是你的意图:

type UpdateForm struct { 
    ID  string `json:"type"` 
} 

func (u UpdateForm) Save(db mongo.Database) { 
    id := u.ID 
    repository.Update(id) 
} 

// UpdateForm instance somewhere 
var u = UpdateForm{} 

func UpdateHandler(request *http.Request) { 
    u.ID := mux.Vars(request)["ID"] 
    u.Save(db) 
} 
+0

你有关实例“的地方”的评论这正是杀了我。实例化在哪里?我如何将数据从一个文件的方法传递到另一个文件本质上是我的问题的关键。 – thatgibbyguy

+1

@thatgibbyguy通过以数据为参数调用方法(或函数),可以将数据从一种方法传递给另一种(或从一种功能转移到另一种功能)。那么,这应该是明显的死亡。请注意,Go没有“基于文件的边界”,它并不**在某些方法所在的文件中。 (这个软件包很重要,但对于出口的东西来说都没问题)。 “实例化某处”的东西:这取决于,例如在更新处理程序中,或全局范围或其他地方。这取决于你正在尝试做什么。 – Volker

+0

实际上,没有UpdateForm方法应该有两个参数 - ID和DB,因为ID应该被传递给另一个函数。 – thatgibbyguy

2

您可以使用请求中的数据填充表单。如果您的请求包含一个JSON编码的身体比你能喜欢这个解码成表单对象:

package main 

import (
    "encoding/json" 
    "net/http" 
    "strings" 
    "fmt" 
) 

type UpdateForm struct { 
    ID string `json:"type"` 
} 

func main() { 
    req, _ := http.NewRequest(
     "POST", 
     "http://example.com", 
     strings.NewReader(`{"type": "foo"}`), 
    ) 

    var form *UpdateForm 
    json.NewDecoder(req.Body).Decode(&form) 
    fmt.Println(form.ID) // Output: foo 
} 

或者,你可以直接实例化它是这样的:

func UpdateHandler(request *http.Request) { 
    ID := mux.Vars(request)["ID"] 
    form := &UpdateForm{ID: ID} 
    form.Save() 
}