htmlのformには、action属性にgetとpostしか取れないため、deleteやputなどを指定できない。ではどうすれば、良いかというと、例えば、phpでは
html
1<form>
2 <input type="hidden" name="_method" value="PATCH">
</form>
```
を書き入れればphp側でよしなに、処理してくれ、patchメソッドが走るようにしてくれている。
しかし、goでは同じように書いても動くわけがなく、上記の仕組みを自分で作成する必要がある。
では、どのようにすればいいかと言うと、routerのprocessが走る前に、処理されるmiddlewareを用意しなければならない。以下、golangのechoを使用しますが、フレームワークを使わなくてもほぼ同じです。
まず、main関数内で以下のようにMethodOverrideを読み込みます。
go
1e.Pre(controllers.MethodOverride)
これで、routerが走る前に最初に動かせます。私は、最初e.Useでも動くと思っていたのですが、うごかず積みました。公式にも、methodOverRideにはe.Preを使えと書いてありました。
で、読み込むmiddleWareですが、以下のような関数になります。
go
1func MethodOverride(next echo.HandlerFunc) echo.HandlerFunc {
2 return func(c echo.Context) error {
3 if c.Request().Method == "POST" {
4 method := c.Request().PostFormValue("_method")
5 if method == "PUT" || method == "PATCH" || method == "DELETE" {
6 c.Request().Method = method
7 }
8 }
9 fmt.Println(c.Request())
10 return next(c)
11 }
12}
つまり、Postメソッドが動いた際に、if以下が処理されます。methodに自分が使いたいhttp method(putやdelete,patchなど)を代入し、requestのmethodを書き換えてやります。そしてチェインさせて、次の関数を呼び出します。
go
1adminGroup.PATCH("/update", controllers.UpdateAdminUser)
Qiitaで同様の記事を書きました。
https://qiita.com/shoking/items/4e26b5438c3437400f53
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。