簡體   English   中英

Play Framework 2.4如何在Action Controller中使用return語句

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM