当前位置:  开发笔记 > 编程语言 > 正文

Playframework:使用Scalatags而不是Twirl

如何解决《Playframework:使用Scalatags而不是Twirl》经验,为你挑选了1个好方法。

我更喜欢使用前者而不是后者,但我不确定如何将Scalatags合并到playframework中.

这是我简单的布局:

object Test
{
  import scalatags.Text.all._
  def build =
  {

    html(
      head(
        title := "Test"
      ),
      body(

        h1("This is a Triumph"),
        div(
          "Test"
        )
      )
    )
  }
}

这是我尝试渲染它的方式:

Ok(views.Test.build.render)

问题是,我把它作为一个普通的字符串,而不是HTML.

现在,当然一个解决方案就是简单地追加.

Ok(views.Test.build.render).as("text/html")

但这真的是唯一的方法吗?(没有创建一个辅助方法)



1> danielnixon..:

我想你想要打电话Ok(views.Test.build).玩的就是无知ScalaTags的所以我们将不得不写的东西在这里自己.

Play使用一些隐式机制来生成HTTP响应.当你打电话给Ok(...)你时,实际上是在呼唤apply这个play.api.mvc.Results特质.我们来看看它的签名:

def apply[C](content: C)(implicit writeable: Writeable[C]): Result

所以我们可以看到我们需要一个隐含的Writeable[scalatags.Text.all.Tag]:

implicit def writeableOfTag(implicit codec: Codec): Writeable[Tag] = {
  Writeable(tag => codec.encode("\n" + tag.render))
}

不要忘记包含doctype声明.ScalaTags不会给你一个.

Writeable.apply自身的调用需要另一个隐式来确定内容类型.这是它的签名:

def apply[A](transform: A => ByteString)(implicit ct: ContentTypeOf[A]): Writeable[A]

所以让我们写一个含蓄的ContentTypeOf[Tag]:

implicit def contentTypeOfTag(implicit codec: Codec): ContentTypeOf[Tag] = {
  ContentTypeOf[Tag](Some(ContentTypes.HTML))
}

这允许我们避免必须as("text/html")明确写入并且它包括charset(由隐式编解码器提供),从而产生Content-Type标题text/html; charset=utf-8.

把它们放在一起:

import play.api.http.{ ContentTypeOf, ContentTypes, Writeable }
import play.api.mvc.Results.Ok
import scalatags.Text.all._

def build: Tag = {
  html(
    head(
      title := "Test"
    ),
    body(

      h1("This is a Triumph"),
      div(
        "Test"
      )
    )
  )
}

implicit def contentTypeOfTag(implicit codec: Codec): ContentTypeOf[Tag] = {
  ContentTypeOf[Tag](Some(ContentTypes.HTML))
}

implicit def writeableOfTag(implicit codec: Codec): Writeable[Tag] = {
  Writeable(tag => codec.encode("\n" + tag.render))
}

def foo = Action { implicit request =>
  Ok(build)
}

你可能想把这些暗示塞在方便的地方,然后在你的控制器中导入它们.


为什么twirl是游戏中的默认模板引擎?scalatags似乎更简单.
推荐阅读
手机用户2402852387
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有