在Revel中,不同的操作使用相同的模板。

huangapple go评论107阅读模式
英文:

Different actions use same template in Revel

问题

根据Revel的手册所述:

给定一个名为Hello的控制器和一个名为World的动作,Revel将查找名为views/Hello/World.html的模板文件。

在Revel中是否有一种方法可以在不同的动作中使用相同的模板?比如名为World和World2的动作使用views/Hello/World.html。

英文:

The Revel manual says:

> Given a controller named Hello with an action named World, Revel will look for a template file named views/Hello/World.html.

Is there a way to use the same template with different actions in Revel? Like actions named World and World2 use views/Hello/World.html.

答案1

得分: 1

你可以尝试类似这样的代码:

  1. func (c App) New() revel.Result {
  2. var event models.Event
  3. event.Start_Year = time.Now().Year()
  4. c.RenderArgs["event"] = event
  5. return c.RenderTemplate("app/edit.html")
  6. }

这段代码是一个Go语言的函数,它创建了一个名为New的方法。在这个方法中,首先创建了一个models.Event类型的变量event。然后,使用time.Now().Year()获取当前年份,并将其赋值给event.Start_Year属性。接下来,将event赋值给c.RenderArgs["event"],这样在渲染模板时可以使用该变量。最后,通过c.RenderTemplate("app/edit.html")来渲染名为app/edit.html的模板,并将结果作为返回值返回。

英文:

You can try something similar to this:

  1. func (c App) New() revel.Result {
  2. var event models.Event
  3. event.Start_Year = time.Now().Year()
  4. c.RenderArgs["event"] = event
  5. return c.RenderTemplate("app/edit.html")
  6. }

答案2

得分: 0

我查看了revel的源代码,我不认为你可以这样做。

这是Controller的Render函数,只看最后一行:

  1. func (c *Controller) Render(extraRenderArgs ...interface{}) Result {
  2. // 获取调用函数的名称。
  3. _, _, line, ok := runtime.Caller(1)
  4. if !ok {
  5. ERROR.Println("无法获取调用者信息")
  6. }
  7. // 获取传入的额外RenderArgs。
  8. if renderArgNames, ok := c.MethodType.RenderArgNames[line]; ok {
  9. if len(renderArgNames) == len(extraRenderArgs) {
  10. for i, extraRenderArg := range extraRenderArgs {
  11. c.RenderArgs[renderArgNames[i]] = extraRenderArg
  12. }
  13. } else {
  14. ERROR.Println(len(renderArgNames), "个RenderArg名称找到,但有", len(extraRenderArgs), "个额外的RenderArgs")
  15. }
  16. } else {
  17. ERROR.Println("在第", line, "行的Render调用中找不到RenderArg名称", "(Action:", c.Action, ")")
  18. }
  19. //templatePath = c.Name + "/" + c.MethodType.Name + "." + c.Request.Format
  20. return c.RenderTemplate(c.Name + "/" + c.MethodType.Name + "." + c.Request.Format)
  21. }

以及RenderTemplate的源代码:

  1. func (c *Controller) RenderTemplate(templatePath string) Result {
  2. // 获取模板。
  3. template, err := MainTemplateLoader.Template(templatePath)
  4. if err != nil {
  5. return c.RenderError(err)
  6. }
  7. return &RenderTemplateResult{
  8. Template: template,
  9. RenderArgs: c.RenderArgs,
  10. }
  11. }

GitHub链接在这里

也许你可以只创建一个World.html的别名文件。

英文:

I checked revel's source code and I don't think you can do this.

Here is the Controller's Render function, just see the last line:

  1. func (c *Controller) Render(extraRenderArgs ...interface{}) Result {
  2. // Get the calling function name.
  3. _, _, line, ok := runtime.Caller(1)
  4. if !ok {
  5. ERROR.Println("Failed to get Caller information")
  6. }
  7. // Get the extra RenderArgs passed in.
  8. if renderArgNames, ok := c.MethodType.RenderArgNames
    ; ok {
  9. if len(renderArgNames) == len(extraRenderArgs) {
  10. for i, extraRenderArg := range extraRenderArgs {
  11. c.RenderArgs[renderArgNames[i]] = extraRenderArg
  12. }
  13. } else {
  14. ERROR.Println(len(renderArgNames), "RenderArg names found for",
  15. len(extraRenderArgs), "extra RenderArgs")
  16. }
  17. } else {
  18. ERROR.Println("No RenderArg names found for Render call on line", line,
  19. "(Action", c.Action, ")")
  20. }
  21. //templatePath = c.Name + "/" + c.MethodType.Name + "." + c.Request.Format
  22. return c.RenderTemplate(c.Name + "/" + c.MethodType.Name + "." + c.Request.Format)

}

and source code of RenderTemplate:

  1. func (c *Controller) RenderTemplate(templatePath string) Result {
  2. // Get the Template.
  3. template, err := MainTemplateLoader.Template(templatePath)
  4. if err != nil {
  5. return c.RenderError(err)
  6. }
  7. return &RenderTemplateResult{
  8. Template: template,
  9. RenderArgs: c.RenderArgs,
  10. }

}

github link is here.

Maybe you can just create an alias file of World.html

答案3

得分: 0

只需在您的操作中通过RenderTemplate()指定常见模板:

  1. func (c *Con) ActionA() revel.Result {
  2. return c.RenderTemplate("视图路径");
  3. }
英文:

Just specify the common template via RenderTemplate() in you action:

  1. func (c *Con) ActionA() revel.Result {
  2. return c.RenderTemplate("the view path");
  3. }

huangapple
  • 本文由 发表于 2014年7月14日 10:24:20
  • 转载请务必保留本文链接:https://go.coder-hub.com/24728777.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定