🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Go

Go(golang)は、Googleで開発されたオープンソースのプログラミング言語です。

Q&A

解決済

1回答

1712閲覧

POSTで渡した情報をgormで更新させたい

profit3003

総合スコア4

Go

Go(golang)は、Googleで開発されたオープンソースのプログラミング言語です。

0グッド

1クリップ

投稿2019/09/06 06:06

編集2019/09/06 06:49

Ginを用いてWebアプリケーションを作成しています。ORMはgormを使用しています。

POSTで渡ったフォームの入力値をDBに更新したいですが、以下のUpdatesを使用した場合では、フィールドがintの値が0で更新されてしまいます。
以下のHTML例の名前・年齢以外の値に対してもupdUserにPOSTしてDBを更新させたいのですが、どのように変更すればよいのでしょうか。
お知恵をお貸し頂けるとありがたいです。

go

1router.POST("/updUser", UpdUser) 23func (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 67}

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>

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2019/09/06 06:44 編集

router.GET("/updUser", UpdUser) となっているのに <form method="post" action="/updUser"> ではどうやってもそのget /updUserには到達しないと思うのですが。 また、 <input type="submit> も閉じのクオートが抜けています。
profit3003

2019/09/06 06:49

大変申し訳ございません!POSTの間違いでした。 submitの方も、ご指摘の通り閉じクォートが抜けておりました。 質問を修正いたしました。
退会済みユーザー

退会済みユーザー

2019/09/06 10:05 編集

> postForm := ctx.Request.PostForm のpostFormと、 > db.Model(&User{}).Where("id = ?", 1).Updates(attrs) のattrsの中身はどうなってますか? printデバッグの結果で良いので貼っていだだけますか。
profit3003

2019/09/07 01:05

ご返信いただき、ありがとうございます! 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はしょっちゅう呼び出す予定です)
guest

回答1

0

自己解決

正しい方法かは分かりませんが、一旦解決いたしましたのでご報告いたします。

構造体によって更新すると、文字列としてですが思った通りの数字がSQLに渡りました。

db.Model(**&**User{}).Where("id = ?", 1).Updates(attrs)

db.Model(User{}).Where("id = ?", 1).Updates(attrs)

UPDATE User SET age = '28', name = '山田 太郎', updated_at = '2019-09-09 13:03:49' WHERE (id = '1') ;

DB側で暗黙の型変換が行われるので、また別の問題があるかもしれませんが、こちらの問題は一旦クローズさせていただきます。
レスポンスいただきましたdyoshikawa様、ありがとうございました。

投稿2019/09/09 04:24

profit3003

総合スコア4

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問