はじめに
Ginでフラッシュメッセージを実装する情報があまり見つからなかったため、備忘録として残します。
コードが冗長的だったり、良い書き方ではなかったりするかもしれませんが、ご了承いただければと思います。
フラッシュメッセージ機能の実装
フラッシュメッセージを表示させるために、Cookieに一時的に保存しすぐに削除することでリダイレクトされた時のみ表示するようにしています。
flash/flash.go
package flash
import (
"github.com/gin-gonic/gin"
)
func SetFlash(c *gin.Context, status string, msg string) {
c.SetCookie("Status", status, 1, "/", "localhost", true, true)
c.SetCookie("Msg", msg, 1, "/", "localhost", true, true)
}
Status
にはメッセージの種類(success,danger等)が入り、Status
に応じて、CSSでフラッシュメッセージの背景色や文字色を変えています。
1秒だけCookieに情報を保存することで、フラッシュメッセージを実装しています。
c.SetCookie()
については下記の記事がわかりやすかったです。
使い方
server/routers.go
func DefineRoutes(r gin.IRouter) {
v1 := r.Group("/")
{
v1.GET("/", handler.GetStatic())
}
{
v1.GET("/login", handler.GetLogin())
v1.POST("/login", handler.PostLogin())
}
}
handler/handler.go
func GetStatic() gin.HandlerFunc {
return func(c *gin.Context) {
status, _ := c.Cookie("Status")
msg, _ := c.Cookie("Msg")
c.HTML(200, "static/index.html", gin.H{"Title": "トップ","Status": status, "Msg": msg})
}
}
func GetLogin() gin.HandlerFunc {
return func(c *gin.Context) {
c.HTML(200, "session/new.html", gin.H{"Title": "ログイン"})
}
}
func PostLogin() gin.HandlerFunc {
return func(c *gin.Context) {
//ログイン処理
flash.SetFlash(c, "success", "ログインしました")
c.Redirect(302, "/")
}
}
HTMLではフラッシュメッセージがある時のみ、表示するようにしています。
static/index.html
{{if .Msg}}
<div class="alert">
<div class="alert__{{.Status}}">
<p>{{.Msg}}</p>
</div>
</div>
{{end}}