2014-03-13 65 views
1

我有以下模板代碼:「值getOrElse不是字符串的成員」 在模板

視圖/ Login.scala.html:

@(loginForm: Form[views.Data]) 

@import mytemplates.loginform 

@Main("") { 
    email:@loginform(loginForm("email")) 
    @*email:@loginForm("email").value.getOrElse("xyz")*@ 
} 

視圖/ mytemplates /登錄表單。 scala.html:

@(emailField: Field) 

@emailField.value.getOrElse("xyz") 

視圖/ Main.scala.html:

@(page: String)(content: Html) 

<!DOCTYPE html> 

<html> 
    <body> 
    @content 
</html> 

視圖/ Data.java:

package views; 

import play.data.validation.ValidationError; 
import java.util.List; 

public class Data { 

    public String email = ""; 

    public Data() { } 

    public List<ValidationError> validate() { 

     return null; 
    } 
} 

上述編譯是成功的。但是,如果行@*email:@loginForm("email").value.getOrElse("xyz")*@Login.scala.html未註釋編譯產生value getOrElse is not a member of String錯誤。

爲什麼會發生這種情況?我想排除模板mytemplates.loginform,但無法使其工作。

編輯:繼estmatic的意見,我得到如下:

的意見/ Login.scala.html:

@loginForm("email").getClass:類play.data.Form $場

@loginForm("email").valueOr("").getClass: class java.lang.String

views/mytemplates/loginform.scala.html:

@emailField.getClass:類play.core.j.PlayMagicForJava $$不久$ 1

@emailField.value.getClass:類scala.None $

我在Login.scala.html使用valueOr("")否則空指針會產生執行異常。顯然他們都是不同的階級。我還沒有使用Play框架,我不確定這意味着什麼。

+0

你可以發佈'loginForm'和'Data'代碼嗎? – Peter

+0

** Data.java **添加到我的問題。 'loginForm'是** Login.scala.html **模板中的參數名稱。 'loginform'是子模板。 – seron

回答

5

由於看起來您有一個Java項目,框架將在Java類和它們的Scala等價物之間進行一些自動轉換。

嘗試了這一點:

@loginForm("email").getClass() 
@loginForm("email").value.getClass() 

使雙方Login.scala.htmlloginform.scala.html這種變化,你會看到你正在處理中的每個場景中不同的班級。

當你通過loginform模板您field.value將被包裝在一個scala.Some對象,這就是爲什麼.getOrElse編譯在這種情況下。當你直接在主視圖中執行時,你永遠不會離開Java-class-world,所以你的field.value直接作爲String返回。

如果您使用的是最新版本的Play,那麼您應該可以使用Field.valueOr方法而不是getOrElse

@loginForm("email").valueOr("xyz")