gpt4 book ai didi

scala - 如何使用 Scala 重定向到 Play Framework 中的相同 Controller 方法?

转载 作者:行者123 更新时间:2023-12-05 01:37:06 25 4
gpt4 key购买 nike

打开网址时

/users/{id}/foo

我将通过调用来显示 View
html.foo(userWithId)

在 Controller 方法 foo 中,我想确保 id 与登录用户的 id 相同,否则应将用户重定向到
/users/{theLoggedInUsersId}/foo

使用
html.foo(loggedInUser)

工作正常,但这不是重定向,因此浏览器中的 url 仍然是
/users/{id}/foo

我想真正重定向,以便 url 显示正确的 id。我不知道该怎么做。像这样使用“ Action ”:
Action(foo(loggedInUsersId))

在不提供返回类型的情况下使用递归会出错。将返回类型 play.template.Html 添加到 Controller 方法 foo 将得到编译器错误,因为 Action 返回的是 ScalaAction 而不是 Html。

我该怎么做。我是否应该这样做,我是否一直在以错误的方式思考它?

编辑

Redirect(...) 工作正常。但是没有它有可能吗?
在伪 Scala 中:
def list(id: Long) = {
if (some_criteria)
html.list(user_with_id_equal_to_id)
else if(another_criteria)
list(another_user_id)
else
Action(Application.login)
}

list(another_user_id) 不起作用,因为它是一个递归调用,我必须在 list 方法上提供一个返回类型。添加返回类型 play.templates.Html 将不起作用,因为这不是 Action 的返回类型

你明白我在说什么吗?如果我不使用列表调用而是使用 html.list(user_with_another_id) 那么它就不会是重定向,并且浏览器中的 url 仍然是/users/id/foo 而不是/user/another_id/foo。

最佳答案

有两种方法可以做到这一点。第一种是使用 Redirect 返回类型。

Redirect("/find/user/" + id)

您想要的方式是按照您的建议使用操作。
Action(findUser(id))

这应该可以正常工作。 Play 实际上将此调用解析为 URL 并调用重定向。所以我展示给你的第一个例子几乎是一样的。 Action 效果更好,因为它可以防止您在更改 url 时必须更改代码。我们可能需要查看您的更多代码才能了解发生了什么。

这是一个更清楚的例子。
    def index( userId : Option[ String ] ) = {  

Action(findCurrentUser(userId.getOrElse("test@test.com")))
}

def findCurrentUser(userId : String) = {

User.find( "email = {email}" ).onParams( userId ).first() match {

case Some( user ) => Json( user )

case None => Error( "Could not find current user" )
}
}

引用: http://scala.playframework.org/documentation/scala-0.9.1/controllers#Returntypeinference

关于scala - 如何使用 Scala 重定向到 Play Framework 中的相同 Controller 方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7885109/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com