gpt4 book ai didi

scala - Playframework:使用 Scalatags 而不是 Twirl

转载 作者:行者123 更新时间:2023-12-04 01:55:58 25 4
gpt4 key购买 nike

我更喜欢使用前者而不是后者,但我不确定如何将 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")

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

最佳答案

我假设您希望能够调用 Ok(views.Test.build) . Play 不知道 ScalaTags,所以我们将不得不自己在这里写一些东西。

Play 使用一些隐式机制来生成 HTTP 响应。当您调用 Ok(...)您实际上是在调用 applyplay.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("<!DOCTYPE html>\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")显式并且它包含字符集(由隐式编解码器提供),导致 Content-Type text/html; charset=utf-8 的 header .

把它们放在一起:
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)
}

您可能希望将这些隐式藏在方便的地方,然后将它们导入您的 Controller 中。

关于scala - Playframework:使用 Scalatags 而不是 Twirl,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41797181/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com