渲染

https://github.com/gobuffalo/buffalo/render  实现了渲染的接口,提供了一个可用的集合,我们可以放心使用,当然也可以自己实现。
下面的文档仅限于https://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{}

本文章首发在 LearnKu.com 网站上。
上一篇 下一篇
superwen
讨论数量: 0
发起讨论 只看当前版本


暂无话题~