英文:
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
你可以尝试类似这样的代码:
func (c App) New() revel.Result {
var event models.Event
event.Start_Year = time.Now().Year()
c.RenderArgs["event"] = event
return c.RenderTemplate("app/edit.html")
}
这段代码是一个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:
func (c App) New() revel.Result {
var event models.Event
event.Start_Year = time.Now().Year()
c.RenderArgs["event"] = event
return c.RenderTemplate("app/edit.html")
}
答案2
得分: 0
我查看了revel的源代码,我不认为你可以这样做。
这是Controller的Render函数,只看最后一行:
func (c *Controller) Render(extraRenderArgs ...interface{}) Result {
// 获取调用函数的名称。
_, _, line, ok := runtime.Caller(1)
if !ok {
ERROR.Println("无法获取调用者信息")
}
// 获取传入的额外RenderArgs。
if renderArgNames, ok := c.MethodType.RenderArgNames[line]; ok {
if len(renderArgNames) == len(extraRenderArgs) {
for i, extraRenderArg := range extraRenderArgs {
c.RenderArgs[renderArgNames[i]] = extraRenderArg
}
} else {
ERROR.Println(len(renderArgNames), "个RenderArg名称找到,但有", len(extraRenderArgs), "个额外的RenderArgs")
}
} else {
ERROR.Println("在第", line, "行的Render调用中找不到RenderArg名称", "(Action:", c.Action, ")")
}
//templatePath = c.Name + "/" + c.MethodType.Name + "." + c.Request.Format
return c.RenderTemplate(c.Name + "/" + c.MethodType.Name + "." + c.Request.Format)
}
以及RenderTemplate的源代码:
func (c *Controller) RenderTemplate(templatePath string) Result {
// 获取模板。
template, err := MainTemplateLoader.Template(templatePath)
if err != nil {
return c.RenderError(err)
}
return &RenderTemplateResult{
Template: template,
RenderArgs: c.RenderArgs,
}
}
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:
func (c *Controller) Render(extraRenderArgs ...interface{}) Result {
// Get the calling function name.
_, _, line, ok := runtime.Caller(1)
if !ok {
ERROR.Println("Failed to get Caller information")
}
// Get the extra RenderArgs passed in.
if renderArgNames, ok := c.MethodType.RenderArgNames; ok {
if len(renderArgNames) == len(extraRenderArgs) {
for i, extraRenderArg := range extraRenderArgs {
c.RenderArgs[renderArgNames[i]] = extraRenderArg
}
} else {
ERROR.Println(len(renderArgNames), "RenderArg names found for",
len(extraRenderArgs), "extra RenderArgs")
}
} else {
ERROR.Println("No RenderArg names found for Render call on line", line,
"(Action", c.Action, ")")
}
//templatePath = c.Name + "/" + c.MethodType.Name + "." + c.Request.Format
return c.RenderTemplate(c.Name + "/" + c.MethodType.Name + "." + c.Request.Format)
}
and source code of RenderTemplate:
func (c *Controller) RenderTemplate(templatePath string) Result {
// Get the Template.
template, err := MainTemplateLoader.Template(templatePath)
if err != nil {
return c.RenderError(err)
}
return &RenderTemplateResult{
Template: template,
RenderArgs: c.RenderArgs,
}
}
github link is here.
Maybe you can just create an alias file of World.html
答案3
得分: 0
只需在您的操作中通过RenderTemplate()指定常见模板:
func (c *Con) ActionA() revel.Result {
return c.RenderTemplate("视图路径");
}
英文:
Just specify the common template via RenderTemplate() in you action:
func (c *Con) ActionA() revel.Result {
return c.RenderTemplate("the view path");
}
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论