我的Application
控制器中有以下代码:
def index = Action {
var ticketsAvailable = 1
Ok(views.html.index)
}
当我尝试运行该应用程序时,出现以下编译错误:
Cannot write an instance of views.html.index.type to HTTP response. Try to define a Writeable[views.html.index.type]
在线上
Ok(views.html.index)
但是,当我添加括号(如下所示)时,错误消失了:
Ok(views.html.index())
这是为什么?我认为在Scala中,没有参数时括号的使用是可选的。
查看生成的Scala代码以获取一个简单的Twirl模板(Twirl是Play模板引擎),该模板称为index.scala.html
:
@()
<h1>Hello, world</h1>
默认情况下,Play会将其编译为中的Scala文件target/scala-2.11/twirl/main/views/html/index.template.scala
,并且,如果您稍稍清理一下以删除源映射(可以将模板中的编译错误转换为输入文件中的右行),它将看起来像这:
package views.html
import play.twirl.api._
object index_Scope0 {
import models._
import controllers._
import play.api.i18n._
import views.html._
import play.api.templates.PlayMagic._
import play.api.mvc._
import play.api.data._
class index
extends BaseScalaTemplate[play.twirl.api.HtmlFormat.Appendable, Format[play.twirl.api.HtmlFormat.Appendable]](play.twirl.api.HtmlFormat)
with play.twirl.api.Template0[play.twirl.api.HtmlFormat.Appendable] {
def apply(): play.twirl.api.HtmlFormat.Appendable = {
_display_ {
{
Seq[Any](format.raw(""""""), format.raw("""<h1>hello, world</h1>"""))
}
}
}
def render(): play.twirl.api.HtmlFormat.Appendable = apply()
def f: (() => play.twirl.api.HtmlFormat.Appendable) = () => apply()
def ref: this.type = this
}
}
object index extends index_Scope0.index
要注意的重要一点是,这views.html.index
是一个对象,它的类型为views.html.index.type
,这就是您不添加括号时要引用的对象。但是,此对象扩展了一个名为的类views.html.index_Scope0.index
,该类具有一个apply()
方法,该方法返回一个Html
对象(或更确切地说,HtmlFormat.Appendable
是非别名类型)。
如果您“调用”一个Scala对象,Scala会将其转换(或“去糖”),以调用apply()
该对象上的方法(这是案例类构造函数不使用new
。的工作方式。)因此,如果使用parens,则会得到一个Html
对象是渲染的Twirl模板的结果。如果不这样做,您只会得到已编译的模板对象本身,而Play并不知道如何写入HTTP响应。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句