Ginを用いてWebアプリケーションを作成しています。ORMはgormを使用しています。
POSTで渡ったフォームの入力値をDBに更新したいですが、以下のUpdatesを使用した場合では、フィールドがintの値が0で更新されてしまいます。
以下のHTML例の名前・年齢以外の値に対してもupdUserにPOSTしてDBを更新させたいのですが、どのように変更すればよいのでしょうか。
お知恵をお貸し頂けるとありがたいです。
go
1router.POST("/updUser", UpdUser) 2… 3func (d *SettingController) UpdUser(ctx *gin.Context) { 4 ctx.Request.ParseForm() 5 postForm := ctx.Request.PostForm 6 7 attrs := make(map[string]interface{}, len(postForm)) 8 for k, v := range postForm { 9 attrs[k] = strings.Join(v, "") 10 } 11 12 db.Model(&User{}).Where("id = ?", 1).Updates(attrs) 13}
go
1type User struct { 2 ID int 3 Name string 4 Age int 5 Email string 6 … 7}
HTML
1<form method="post" action="/updUser"> 2 名前:<input type="text" name="name"> 3 年齢:<input type="text" name="age"> 4 <input type="submit"> 5</form>
router.GET("/updUser", UpdUser)
となっているのに
<form method="post" action="/updUser">
ではどうやってもそのget /updUserには到達しないと思うのですが。
また、
<input type="submit>
も閉じのクオートが抜けています。
大変申し訳ございません!POSTの間違いでした。
submitの方も、ご指摘の通り閉じクォートが抜けておりました。
質問を修正いたしました。
> postForm := ctx.Request.PostForm
のpostFormと、
> db.Model(&User{}).Where("id = ?", 1).Updates(attrs)
のattrsの中身はどうなってますか?
printデバッグの結果で良いので貼っていだだけますか。
ご返信いただき、ありがとうございます!
postFormが、
map[age:[28] name:[山田 太郎]]
attrsの方は、
map[age:28 name:山田 太郎]
と、なっていました。
またDebugメソッドでSQLを確認しましたところ、以下のようになっていました。
UPDATE `User` SET `age` = 0, `name` = '山田 太郎', `updated_at` = '2019-09-07 09:30:35' WHERE (id = '1') ;
ageはintなのにstringで渡してしまった為に、gormがキャストしてくれた?段階で0になったのでしょうか。
attrsの値を設定する時に、reflectなどで型を判定すれば良いのでしょうか。
(それは良いやり方でしょうか?updUserはしょっちゅう呼び出す予定です)
回答1件
あなたの回答
tips
プレビュー