[英]How to break REST controller that return Action in Scala/Play framework
[英]Play Framework 2.4 how to use return statement in Action controller
有沒有一種方法可以在Action控制器內返回值。
我的用戶模型中有一個方法,該方法返回給定用戶的朋友數。
def nrOfFriends(current_user: Long): Int = {
DB.withConnection{ implicit connection =>
var nr: Int = SQL("select count(*) from friend where user_id_1=" + current_user + " or user_id_2=" + current_user).as(scalar[Int].single)
nr
}
}
在我的控制器中,我只想從模型中返回值
def freunde() = IsAuthenticated { username => _ =>
User.findByUsername(username).map { user =>
var nr: Int = Friend.nrOfFriends(user.id.get)
Ok(""+nr)
}.getOrElse(Forbidden)
}
但是以書面形式,它將打印與數字連接的“空字符串”
如果我將Ok(“” + nr)替換為Ok(nr),則會收到以下錯誤:
“無法將Int的實例寫入HTTP響應。嘗試定義Writeable [Int]”
我需要我的操作返回一個值,以便可以將值從操作傳遞到導航欄中的header.views.html之類的東西。
<a href="#">@Freund.freunde Friends</a>
如果您希望您的響應只是nr
的值,則可以簡單地調用nr.toString
:
def freunde() = IsAuthenticated { username => _ =>
User.findByUsername(username).map { user =>
var nr: Int = Friend.nrOfFriends(user.id.get)
Ok(nr.toString)
}.getOrElse(Forbidden)
}
你得到的錯誤提到的事實, Int
不具有隱含的Writeable[Int]
范圍。 因此play不知道如何在http響應中顯示Int
。
您可以通過在范圍內添加make Int
可寫:
implicit val intWriteable = play.api.http.Writeable[Int](_.toString.getBytes, None)
然后,您可以說:
Ok(nr)
沒有錯誤。
但是,聽起來您只希望將nrOfFriends
的結果放在不相關的模板中。 在這種情況下,您應該完全使用Action
。 相反,只需在需要數據的模板內調用模型函數即可。
<a href="#">@User.nrOfFriends(user.id) Friends</a>
當然,您還需要將用戶傳遞給模板。
您沒有發布要完成的所有代碼的完整示例,所以我認為這是目前為止我能做的最好的事情。 也許嘗試發布<a>
所在的基本模板。
重要的一點是Action
是用於產生HTTP響應的,而不僅僅是應用程序內部的普通數據。
控制器的動作處理請求並生成要發送到客戶端的結果。 換句話說,一個操作返回一個play.api.mvc.Result值,該值表示要發送到Web客戶端的HTTP響應。 在您的示例中,Ok構造一個200 OK響應。 響應的主體必須是預定義的類型之一,包括text / plain,json和html。 朋友的數目是整數,不是可接受的主體類型。 因此,解決此問題的簡單方法是使用.toString()將其轉換為文本/純文本。
另一方面,您可以為Int定義編寫器,以使Play知道如何將整數轉換為json格式。
有關更多詳細信息,請查看此https://www.playframework.com/documentation/2.2.x/ScalaActions 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.