Преобразование длинных Scala в печатные формы - PullRequest
4 голосов
/ 10 февраля 2012

Я пытаюсь преобразовать идентификатор пользователя из класса User и сохранить его в Play!переменная сеанса.Однако, когда я пытаюсь распечатать эту переменную сеанса, она возвращает пустую строку.Это простая аутентификация.

Во время аутентификации:

session += "userid" -> user.id.toString

Печать переменной сеанса в Play!представление scala:

@ctx("userid")

Вся аутентификация def:

    def authenticate(login:LoginAttempt) = {
          println("in authenticate")
      User.authenticate(login.username, login.password) match {
            case Some(user:User) => {
              session += "username" -> user.emailAddress
              session += "userid" -> user.id.toString
              session += "name" -> user.name
          session += "accounts" -> user.accounts.toString
              Redirect(session("path").getOrElse("/"))
            }
            case _ => {
              flash += "error" -> "Wrong username or password."
              Action(Authentication.login)
            }
        }
    }

И класс пользователя:

case class User(
  val id: Long,

Решение? Что такоеотсутствует или идет не так, что препятствует сохранению user.id в сеансе?Спасибо

1 Ответ

3 голосов
/ 10 февраля 2012

После расспросов и прочтения, это действительно было вызвано «особенностью» Play!1.2.4 рамки.К счастью, мы можем ожидать большего с v2.

Для нашего конкретного приложения есть третий часто пропускаемый шаг, когда дело доходит до переменных сеанса.Вам нужно renderArgs для каждого из них, чтобы они были доступны.Поэтому комментарий @ChrisJamesC был в основном правильным: в инициализации отсутствовал шаг.

Вот что происходит в нашем контроллере Secure.scala:

(session("userid"), session("username"), session("name"), session("accounts")) match {
            case (Some(userid), Some(username), Some(name), Some(accounts)) => {
                renderArgs += "userid" -> userid
                renderArgs += "username" -> username
                renderArgs += "name" -> name
                        renderArgs += "accounts"  -> accounts
                Continue
            }
            case _ => {
                session += "path" -> Request.current().path
                Action(Authentication.login)
            }
        }

В моем собственном случае яне понимал, что мне нужно сделать renderArgs для каждой переменной, которую я хочу сохранить и получить к ней доступ в сеансе.Но есть одна загвоздка: вам все равно нужно хранить каждую переменную как строку.

Затем в каждой игре!view Я могу получить доступ к var следующим образом: @ctx("userid")

Надеюсь, это поможет будущим людям, использующим Play!

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