0

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

2 回答 2

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]范围的事实。所以 play 不知道如何Int在 http 响应中显示。

您可以通过将其置于范围内来添加 make Intwriteable:

implicit val intWriteable = play.api.http.Writeable[Int](_.toString.getBytes, None)

然后你就可以说:

Ok(nr)

没有错误。

但是,听起来您只想nrOfFriends要不相关模板内部的结果。如果是这种情况,您应该使用 a Action。相反,只需在需要数据的模板中调用模型函数。

<a href="#">@User.nrOfFriends(user.id) Friends</a>

当然,您还需要将用户传递给模板。

你没有发布你想要完成的所有代码的完整示例,所以我认为这是我现在能做的最好的。也许尝试发布您所在的基本模板<a>

重要的一点是Actions 用于生产 HTTP 响应,而不仅仅是应用程序内部的纯数据。

于 2015-08-18T16:24:11.897 回答
0

控制器的动作处理请求并生成要发送给客户端的结果。换句话说,一个动作返回一个 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

于 2015-08-18T16:37:37.660 回答