Как вы перенаправляете на тот же метод контроллера в playframework, используя Scala? - PullRequest
4 голосов
/ 25 октября 2011

При открытии URL

/users/{id}/foo

я буду отображать вид с вызовом

html.foo(userWithId)

В методе контроллера foo я хочу убедиться, что id такой же, какидентификатор пользователя, вошедшего в систему и, если нет, должен перенаправить пользователя на

/users/{theLoggedInUsersId}/foo

, используя

html.foo(loggedInUser)

, работает нормально, но это не перенаправление, поэтому URL в браузере по-прежнему равен

/users/{id}/foo

Я хочу действительно перенаправить, чтобы URL отображал правильный идентификатор.Я не уверен, как это сделать.Используя «Действие» следующим образом:

Action(foo(loggedInUsersId))

получит ошибку при использовании рекурсии без указания типа возврата.Добавление возвращаемого типа play.template.Html к методу контроллера foo приведет к ошибке компилятора, поскольку Action возвращает ScalaAction, а не Html.

Как это сделать.Должен ли я даже сделать это, я застрял, думая об этом неправильно?

Edit

Перенаправление (...) работает нормально.Но можно ли обойтись без этого?В псевдо-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)
}

Список (another_user_id) не будет работать, так как это рекурсивный вызов, и я должен указать тип возврата в методе list.Добавление типа возврата play.templates.Html не будет работать, так как это не тип возврата Действие

Вы видите, к чему я клоню?Если я вместо вызова list использую html.list (user_with_another_id), то это не будет перенаправление, и URL-адрес в браузере будет по-прежнему / users / id / foo вместо / user /another_id / Foo.

1 Ответ

5 голосов
/ 26 октября 2011

Есть два способа сделать это. Первый - использовать тип возвращаемого значения Redirect.

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

То, как вы хотите, это использовать действие, как вы предложили.

Action(findUser(id))

Это должно работать нормально. Play фактически разрешает этот вызов как URL и вызывает перенаправление. Итак, первый пример, который я вам показал, - это почти то же самое. Действие работает лучше, потому что оно предотвращает необходимость изменения кода, если вы измените 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...