【问题标题】:revel flash messages are not displayedrevel flash 消息不显示
【发布时间】:2019-01-26 15:58:48
【问题描述】:

我创建了一个带有默认骨架的 revel web 应用程序。

我创建了一个新的路线/动作/视图:

控制器动作:

func (c Ctrl1) Action3() revel.Result {
    variable1 := "test1"
    variable2 := "test2"
    c.Flash.Error("Message")
    return c.Render(variable1,variable2)
}

Action3.html:

{{set . "title" "Test"}}
{{template "header.html" .}}
{{template "flash.html" .}}
Hello: {{.variable1}}
{{template "footer.html" .}}

我第一次运行我的 web 应用程序时,我看到了 flash 消息。 但是下次,如果我刷新页面,它就会消失!

我已经重新开始狂欢了

谢谢

【问题讨论】:

    标签: go revel


    【解决方案1】:

    我不熟悉revel,但是当您需要一些用户通信以通过重定向进行转移时,通常会使用消息“闪烁”。 godoc 似乎也准确地描述了该用例。

    如果您直接在此请求处理程序中呈现模板,您可能不应该使用c.Flash。我对正在发生的事情的猜测是revel 只会显示带有请求的 Flash 消息 received。调用c.Flash.Error 会设置cookie 中的字段,这意味着它将被发送回调用者,而不是模板。在 next 渲染中,它将从调用者发送回服务器的 cookie 中读取,其中将包含此 flash 消息。不过,显然,设置新的 flash 消息会替换旧消息,导致它(再次)将其发送给调用者而不是模板。

    好消息是,您的信息实际上只有一种方式进入页面,而且您几乎可以肯定地在那里硬塞您的信息:模板数据!不要调用c.Flash.Error,而是使用通常的机制发送消息。在这种情况下,假设您的 flash.html 模板包含以下内容:

    {{ if .flash.error }}
        <div class="error">{{ .flash.error }}</div>
    {{ end }}
    

    您应该能够通过将c.Flash.Error("Message") 行替换为:

    c.ViewArgs["flash"] = map[string]string{"error": "Message"}
    

    【讨论】:

      【解决方案2】:

      这似乎是a known issue/expected behaviour。正如 github 上的讨论所暗示的那样,要使用 flash 消息来处理错误,您要么需要重定向:

      c.Flash.Error("Message")
      return c.Redirect("App/ShowError")
      

      如果您需要在特定输入元素旁边添加错误消息,请使用field template function

      鉴于您没有在模板中呈现表单,我猜您需要添加重定向。


      顺便说一句:狂欢被许多人认为是有害的。我敦促您不要使用试图强迫您使用 go 遵循经典 MVC 结构的框架。如今,大多数 Web 应用程序都是在客户端使用 react 和基于 API 的后端的单页应用程序。走这条路可能会让你的生活更轻松吗?

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-11-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多