首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Playframework:使用Scalatag而不是Twirl

Playframework:使用Scalatag而不是Twirl
EN

Stack Overflow用户
提问于 2017-01-22 23:09:32
回答 1查看 948关注 0票数 12

我更喜欢使用前者,而不是后者,但我不知道如何将Scalatag集成到框架中。

这是我的简单布局:

代码语言:javascript
复制
object Test
{
  import scalatags.Text.all._
  def build =
  {

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

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

我就是这样把它呈现出来的:

代码语言:javascript
复制
Ok(views.Test.build.render)

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

现在,当然有一个解决方案是简单地附加。

代码语言:javascript
复制
Ok(views.Test.build.render).as("text/html")

但这真的是唯一的办法吗?(没有创建一个助手方法,即)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-03-20 05:56:43

我想你想要能够打电话给Ok(views.Test.build)。Play对ScalaTags一无所知,所以我们必须在这里自己写点东西。

Play使用一些隐式机制来生成HTTP响应。当您调用Ok(...)时,您实际上是在调用applyplay.api.mvc.Results特性。让我们来看看它的签名:

代码语言:javascript
复制
def apply[C](content: C)(implicit writeable: Writeable[C]): Result

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

代码语言:javascript
复制
implicit def writeableOfTag(implicit codec: Codec): Writeable[Tag] = {
  Writeable(tag => codec.encode("<!DOCTYPE html>\n" + tag.render))
}

不要忘记包括一个doctype声明。ScalaTags不给你一个。

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

代码语言:javascript
复制
def apply[A](transform: A => ByteString)(implicit ct: ContentTypeOf[A]): Writeable[A]

因此,让我们编写一个隐式ContentTypeOf[Tag]

代码语言:javascript
复制
implicit def contentTypeOfTag(implicit codec: Codec): ContentTypeOf[Tag] = {
  ContentTypeOf[Tag](Some(ContentTypes.HTML))
}

这允许我们避免显式地编写as("text/html"),它包括字符集(由隐式编解码器提供),从而导致text/html; charset=utf-8Content-Type头。

把这一切结合在一起:

代码语言:javascript
复制
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("<!DOCTYPE html>\n" + tag.render))
}

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

您可能希望将这些请求放在方便的地方,然后将它们导入到控制器中。

票数 17
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41797181

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档