渲染
github.com/gobuffalo/buffalo/rende... 实现了渲染的接口,提供了一个可用的集合,我们可以放心使用,当然也可以自己实现。
下面的文档仅限于github.com/gobuffalo/buffalo/rende... ,更多的信息可以参考github.com/gobuffalo/plush。
自动渲染
有时候,我们同样的内容需要渲染成XML、JSON、HTML,render提供了一个简单的方法。
func Beatles(c buffalo.Context) error {
members := models.Members{}
// ...
return c.Render(200, r.Auto(c, members))
}
JSON和XML
我们可以使用r.JSON 和 r.XML来渲染JSON和XML的内容。系统会根据http请求头来判断用什么方式来渲染内容。
func MyHandler(c buffalo.Context) error {
return c.Render(200, r.JSON(User{}))
}
func MyHandler(c buffalo.Context) error {
return c.Render(200, r.XML(User{}))
}
Markdown
使用render.HTML or render.Template 的时候,如果模板文件的文件名后缀是md,就会使用Markdown来渲染成HTML。
// beatles.md
# The Beatles
<%= for (name) in names { %>
* <%= name %>
<% } %>
// actions/beatles.go
func Beatles(c buffalo.Context) error {
c.Set("names", []string{"John", "Paul", "George", "Ringo"})
return c.Render(200, r.HTML("beatles.md"))
}
// output
<h1>The Beatles</h1>
<ul>
<li>John</li>
<li>Paul</li>
<li>George</li>
<li>Ringo</li>
</ul>
自动扩展
使用HTML, Javascript渲染的时候,模板文件的扩展名可以忽略。
// actions/beatles.go
func Beatles(c buffalo.Context) error {
c.Set("names", []string{"John", "Paul", "George", "Ringo"})
// Render beatles.html
return c.Render(200, r.HTML("beatles"))
}
自定义渲染
r.Func
有两个参数,一个是返回的http类型,一个是函数,该函数将数据提供给io.Writer。
func MyHandler(c buffalo.Context) error {
return c.Render(200, r.Func("application/csv", csvWriter))
}
func csvWriter(w io.Writer, d render.Data) error {
cw := csv.NewWriter(w)
if err := cw.Write([]string{"a", "b", "c"}); err != nil {
return errors.WithStack(err)
}
cw.Flush()
return nil
}
当然也可以使用匿名方法:
var myJSONString string
return c.Render(200, r.Func("application/json", func(w io.Writer, d render.Data) error {
_, err := w.Write([]byte(myJSONString))
return err
}))
渲染器接口
为了使渲染器能够被Context#Render
使用,必须实现以下接口:
// Renderer interface that must be satisified to be used with
// buffalo.Context.Render
type Renderer interface {
ContentType() string
Render(io.Writer, Data) error
}
// Data type to be provided to the Render function on the
// Renderer interface.
type Data map[string]interface{}