Play Framework 2.4如何在Action控制器中使用return语句

时间:2015-08-17 22:13:25

标签: scala playframework-2.4 view-templates

有没有办法在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>

2 个答案:

答案 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