2015-11-14 71 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() 
}