有没有办法在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响应。尝试定义可写[Int]"
我需要让我的操作返回一个值,以便我可以将操作中的值传递给导航栏中的header.views.html
<a href="#">@Freund.freunde Friends</a>
答案 0 :(得分:0)
如果您希望自己的回复只是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]
这一事实。因此,游戏并不知道如何在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响应,而不仅仅是应用程序内部的纯数据。
答案 1 :(得分:0)
控制器的操作处理请求并生成要发送到客户端的结果。换句话说,操作返回play.api.mvc.Result值,表示要发送到Web客户端的HTTP响应。在您的示例中,Ok构造了200 OK响应。响应的主体必须是预定义类型之一,包括text / plain,json和html。朋友的数量是整数,并且不是身体的可接受类型。因此,解决此问题的一种简单方法是使用 .toString()将其转换为text / plain。
另一方面,您可以为Int定义一个编写器,让Play知道如何将整数转换为json格式。
有关详细信息,请查看此https://www.playframework.com/documentation/2.2.x/ScalaActions。