2015-05-01 3 views
0

Я использую действие композиции для play framework 2.3, и я хотел бы отправить параметры в пользовательское действие.Как отправить параметр пользовательскому действию?

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

def myAction(p1: String) = CachedAction(key="myAction1"+p1, time = 300.seconds) { 
implicit request => 
... do an expensive calculation … 
    Ok(views.html.example.template()) 
} 

я испытал ActionBuilder в сочетании с пользовательским запросом, но я не нашел решение.

Я знаю, что игра предлагает кэш для действий, к сожалению, кэш не отвечает всем требованиям.

ответ

1

Я не уверен, что решение с ActionBuilder или ActionRefiner, но которые могут работать на вас:

def CachedAction(key: String, time: Duration)(f: Request[AnyContent] => Result) = { 
    Action{ request => 
    if(cache.contains(key)){ 
     ... 
    } else{ 
     ... 
    } 
    f(request) 
    } 
} 

, а затем:

def myAction(p1: String) = CachedAction("hello" + p1, 100 millis){ request => 
    Ok("cached action") 
} 

Edit: Так как вам нужно Action.async вы можете написать что-то вроде этого:

case class Caching[A](key: String, time: Duration)(action: Action[A]) extends Action[A] { 
    def apply(request: Request[A]): Future[Result] = { 
     if(cache.contains(key)){ 
     Logger.info("Found key: " + key) 
     } 
     action(request) 
    } 
    lazy val parser = action.parser 
} 

def cached(p1: String) = Caching(key = p1, time = 100 millis){ 
    Action.async { Future(Ok("hello")) } 
    //or 
    Action { Ok("hello") } 
} 

Ca se class с двумя списками параметров выглядит странно, но он работает. Документы: https://www.playframework.com/documentation/2.3.x/ScalaActionsComposition#Composing-actions

+0

Теперь кэш работает. Благодаря бесконечности. Простые решения всегда лучшие! Тем не менее, небольшой недостаток: мы не можем напрямую использовать собственные методы действий, такие как «async» (как мы могли бы, если бы мы использовали ActionBuilder), но «async» легко повторить. – Eduardo

+0

Это правда, см. Мое редактирование. – Infinity

+0

Еще раз спасибо ... – Eduardo

Смежные вопросы