【问题标题】:Play Framework 2.4 how to use return statement in Action controllerPlay Framework 2.4 如何在Action控制器中使用return语句
【发布时间】:2015-11-10 16:33:18
【问题描述】:

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

【问题讨论】:

    标签: scala playframework-2.4 view-templates


    【解决方案1】:

    如果您希望您的回复只是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 writeable,方法是把它放在作用域中:

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

    那么你就可以说:

    Ok(nr)
    

    没有错误。

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

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

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

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

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

    【讨论】:

    • 感谢您的回答。我不能在模板中调用模型函数,因为这个模板代表了包含在所有其他模板中的标题。为了按照您的建议编写代码,@User.nrOfFriends(user.id) 我必须传入会话并获取登录用户(即当前会话中的用户)的 nrOfFriends。如果我通过会话,那么我还必须在包含我的标题模板的所有其他模板中传递它。我试过这样做,但我卡住了......也许我做错了什么,但我不知道是什么
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-10-02
      • 1970-01-01
      • 1970-01-01
      • 2014-01-30
      • 2020-06-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多