2016-03-07 16 views
4

我在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) 

但是,當我添加括號(如下所示),錯誤消失rs:

Ok(views.html.index()) 

這是爲什麼? 我認爲,在Scala中,當沒有參數時,括號的用法是可選的。

+2

你認爲是錯的。請參閱http://docs.scala-lang.org/style/naming-conventions.html#parentheses – Jubobs

回答

7

這可能是有益的看一個簡單的旋轉扭曲模板生成的Scala代碼(捻是播放模板引擎)稱爲index.scala.html

@() 

<h1>Hello, world</h1> 

默認情況下,播放將編譯這在斯卡拉文件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 

重要事情o請注意,views.html.index是一個對象,其類型爲views.html.index.type,如果不添加parens,那就是您所指的。該目的,但是,延伸的稱爲views.html.index_Scope0.index類,其具有apply()方法,它返回一個Html對象(或者更確切地說,HtmlFormat.Appendable,這是去混疊的類型。)

如果「呼叫」 Scala的對象,Scala的平移(或「de-sugars」)在對象上調用apply()方法(這是案例類構造函數如何在不使用new的情況下工作的。)因此,如果使用parens,則會得到一個Html對象,該對象是渲染的Twirl模板的結果。如果你不這樣做,你只需要獲得已編譯的模板對象本身,而Play不知道如何寫入HTTP響應。