Использование ActionBuilder вместе с securesocial SecuredAction

Я использую play 2.2.1 с securesocial, и многие мои действия аутентифицируются с использованием SecuredAction, предоставленного securesocial.

Теперь я хотел бы создать ActionBuilder для определенного типа запроса, например ItemAction в документации.

Я пытаюсь сделать что-то вроде этого

  /**
   * ActionBuilder for use with actions that use Item objects.
   */
  def ItemAction() = new ActionBuilder[RequestWithItem] {
    def invokeBlock[A](request: SecuredRequest[A], block: (RequestWithItem[A]) => Future[SimpleResult]) = {
      val futureItem = itemsCollection.
        find(Json.obj("identityId" -> request.user.identityId)).one[Item]
      futureItem.flatMap { maybeItem =>
        maybeItem match {
          case Some(item) => {
            block(new RequestWithItem(item, request))
          }
          case _ => Future(BadRequest("could not get a item for this user."))
        }
      }
    }
  }

и я получаю эту ошибку компиляции

 object creation impossible, since method invokeBlock in trait ActionBuilder of type [A](request: play.api.mvc.Request[A], block: models.RequestWithitem[A] => scala.concurrent.Future[play.api.mvc.SimpleResult])scala.concurrent.Future[play.api.mvc.SimpleResult] is not defined

Я понимаю, что invokeBlock должен принимать play.api.mvc.Request[A] вместо securesocial.core.SecuredRequest[A], но я не могу заставить его работать.


person yzernik    schedule 22.11.2013    source источник


Ответы (1)


Предполагая, что вы хотите составить ItemAction с SecuredAction (через SecureSocial), это будет один из подходов:

case class Item(id: Long) // replace with your real world item

def SecuredItemAction(f: => Item => Request[AnyContent] => Result) = 
  SecuredAction { implicit request =>
  val item = Some(new Item(7)) // replace with your real world item fetch
  item.map { item =>
    f(item)(request)
  }.getOrElse(NotFound)
}

И тогда вы можете использовать его следующим образом:

def index = SecuredItemAction { item =>
  implicit request =>
    Ok(item.id.toString)
}
person mantithetical    schedule 22.11.2013
comment
Можно ли получить SecuredItemAction как объект Action? - person yzernik; 23.11.2013
comment
Я не совсем уверен, что вы пытаетесь сделать. Не могли бы вы обновить свой вопрос, указав, как вы хотели бы использовать свое действие? - person mantithetical; 23.11.2013
comment
Я пытаюсь создать что-то, что я могу повторно использовать с разными парсерами тела для разных действий, и это также будет работать с асинхронными результатами. - person yzernik; 29.11.2013
comment
@yzernik Вы придумали что-то, что может использовать разные парсеры тела? - person Roger; 08.09.2014