Переменная в обработчике не передается в шаблон - PullRequest
0 голосов
/ 24 августа 2018

Learning Go and Gin из здесь .Таким образом, у меня есть маршрутизатор, подобный этому

userRoutes.POST("/login", ensureNotLoggedIn(), performLogin)

, и функция обработчика выглядит так

func performLogin(c *gin.Context) {
  username := c.PostForm("username")
  password := c.PostForm("password")
  if isUserValid(username, password) {
    token := generateSessionToken()
    c.SetCookie("token", token, 3600, "", "", false, true)
    //is_logged_in is not working in template
    c.Set("is_logged_in", true)
    render(c, gin.H{"title": "Successful Login"}, "login-successful.html")
  } else {
    c.HTML(http.StatusBadRequest, "login.html", gin.H{
        "ErrorTitle":   "Login Failed",
        "ErrorMessage": "Invalid credentials provided",
    })
  }
}

, а мой шаблон выглядит как

{{ if .is_logged_in }}
      <li><a href="/article/create">Create Article</a></li>
{{ end }}
{{ if not .is_logged_in }}
    <li><a href="/u/register">Register</a></li>
{{end}}

Но в концеэта переменная в шаблоне, кажется, не работает, только второй раздел показывает, первая ссылка «Создать статью» всегда скрывается.

Обновление

Я изменил функцию обработчика накак-то так,

        render(c, gin.H{"title": "Successful Login", "is_logged_in": c.MustGet("is_logged_in").(bool)}, "login-successful.html")

явно передавая переменную.Теперь элемент шаблона скрыть и показать правильно.Так что-нибудь изменилось в Голанге или Джине, чтобы .Set() вел себя по-другому?

1 Ответ

0 голосов
/ 19 января 2019

Загружаете ли вы шаблон в первую очередь?

func main() {
router := gin.Default()
router.LoadHTMLGlob("templates/*")
//router.LoadHTMLFiles("templates/template1.html", "templates/template2.html")
router.GET("/index", func(c *gin.Context) {
    c.HTML(http.StatusOK, "index.tmpl", gin.H{
        "title": "Main website",
    })
})
router.Run(":8080")

} templates / index.tmpl

<html>
<h1>
    {{ .title }}
</h1>

...