go - 如何使用 Revel/Golang 从 Controller 设置持久性全局模板变量

标签 go revel

我是 Golang 的新手,我正在从 Node.js 服务器切换到 Golang 服务器,我正在尝试重写我之前为 Node 编写的应用程序。

我想在用户登录时设置模板变量,但我不确定如何设置,是的,我已经尝试用谷歌搜索了。

这是我的注册用户 Controller :

func (c User) RegisterUser(user_email, user_password,
    user_password_confirmation, user_first_name,
    user_last_name string) revel.Result {

    // Validate Email
    c.Validation.Required(user_email).Message("Username is required")
    c.Validation.Email(user_email).Message("Email is not a valid email")
    c.Validation.MinSize(user_email, 5).Message("Email must be greater than 5 characters")
    // Validate Password
    c.Validation.Required(user_password).Message("Password is required")
    c.Validation.MinSize(user_password, 5).Message("Password must be greater than 5 characters.")
    // Validate Password Confirmation
    c.Validation.Required(user_password_confirmation).Message("Password Confirmation is required")
    c.Validation.MinSize(user_password_confirmation, 5).Message("Password must be greater than 5 characters.")
    c.Validation.Required(user_password == user_password_confirmation).Message("Your passwords do not match")
    // Validate First Name
    c.Validation.Required(user_first_name).Message("First Name is required")
    c.Validation.MinSize(user_first_name, 3).Message("Your First Name must be greater than 3 characters")
    // Validate Last Name
    c.Validation.Required(user_last_name).Message("Last Name is required")
    c.Validation.MinSize(user_last_name, 3).Message("Your Last Name must be greater than 3 characters")

    // If anything wasn't right, set flash and display errors to user
    if c.Validation.HasErrors() {
        c.Validation.Keep()
        c.FlashParams()
        return c.Redirect(User.Register)
    }

    // Hash The Users Password
    password := []byte(user_password_confirmation)
    hashedPassword, err := bcrypt.GenerateFromPassword(password, 10)
    if err != nil {
        c.Flash.Error("Invalid Username or Password Combination")
        return c.Redirect(User.Register)
    }

    // Connect to database
    db, err := sql.Open("mysql", "root:******@/WebRTC")
    if err != nil {
        c.Flash.Error("Unable to connect to database. Try again later!")
        return c.Redirect(User.Register)
    }
    defer db.Close()

    // Ping the database, ensure there is a connection
    err = db.Ping()
    if err != nil {
        c.Flash.Error("Unable to connect to database. Try again later!")
        return c.Redirect(User.Register)
    }

    // Prepare SQL Statement for Security
    stmtIns, err := db.Prepare("INSERT INTO users (user_email, user_first_name, user_last_name, " +
        "user_password_hash, user_created_at, user_created_ip, user_last_ip) VALUES (?, ?, ?, ?, ?, ?, ?)")

    if err != nil {
        c.Flash.Error("Unable to Register you. Please try again later")
        return c.Redirect(User.Register)
    }
    defer stmtIns.Close()

    // Insert Data into Database
    _, err = stmtIns.Exec(user_email, user_first_name, user_last_name, hashedPassword,
        time.Now().Local(), c.Request.RemoteAddr, c.Request.RemoteAddr)
    if err != nil {
        c.Flash.Error("Unable to register you. Please try again later")
        return c.Redirect(User.Register)
    }

    // Here I want to add the global template variable
    return c.Redirect(User.Register)
}

我读过有关 c.RenderArgs 的内容,但它似乎并没有按照我的要求进行。

我希望能够设置用户的用户名,以便我可以在导航栏中显示它,以便他们知道他们已登录。

最佳答案

如果您正在使用 c.RenderArgs,那么您的方向是对的,除非我误解了您的意图。

这是一个示例(或更确切地说,一个演练),说明您可以如何使用它(取自 Revel 的 booking sample app ):

  1. init.go:注册interceptor在执行操作之前添加用户信息(AddUser 将在 Render 之前触发)。

  2. app.go:检查用户是否已连接,如果已连接,则将用户数据存储在 RenderArgs 映射中,如下所示:

c.RenderArgs["user"] = user

  1. 第 31 行处理 model .

  2. header.html:将用户名模板变量传入。

希望对您有所帮助。

编辑:我应该补充一点,用户的用户名是 stored in a session登录后。它用于retrieve more information .

关于go - 如何使用 Revel/Golang 从 Controller 设置持久性全局模板变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27893339/

相关文章:

go - 从 Websockets 读取数据的最佳方式

mysql - global var out out init.go in revel

ssl - 启用 SSL 后,Revel 不会转发到端口 443

html - Revel 中的嵌套模板无法正确加载

html - 为什么 Revel Web 框架教程应用程序不起作用

http - 如何用go语言为http客户端设置套接​​字选项(IP_TOS)?

regex - 用于查找格式错误的引用字符串的正则表达式

去网/http请求

mysql - 我想检查记录是否存在,如果不存在,那么我想使用 golang 将该记录插入数据库

go - golang 中带有嵌入式锁的通用结构集合