我更喜欢使用前者而不是后者,但我不确定如何将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)
.玩的就是无知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) }
你可能想把这些暗示塞在方便的地方,然后在你的控制器中导入它们.