2015-12-14 17 views
12

mie azioni di controllo utilizzare un'azione personalizzata che assomiglia:Come passare i messaggi quando faccio l'iniezione MessageApi e utilizzare l'I18nSupport Trait

class ActionWithContext @Inject()(....) 
    extends ActionBuilder[ContextAwareRequest] { 

    def invokeBlock[A](request: Request[A], block: (ContextAwareRequest[A]) =>     Future[Result]) = { 
    ... 
    } 

} 

class ContextAwareRequest[A](val context: MyContext, request: Request[A]) extends WrappedRequest[A](request) 

mio regolatore assomiglia:

sguardi pagina
import play.api.i18n.{MessagesApi, I18nSupport, Messages} 
import play.api.i18n.Messages.Implicits._ 
class WebsiteController @Inject() (val messagesApi: MessagesApi, actionWithContext: ActionWithContext, ..) 
     extends BaseController with I18nSupport { 


    def edit(websiteId: Int) = actionWithContext { request => 
     val model = .. 
     Ok(views.html.backend.websites.edit(model)(request.context)) 
     } 

    } 

La vista come:

@(form: Form[controllers.WebsiteForm])(implicit context: MyContext, m: Messages) { 


} 

sto ottenendo l'errore:

not enough arguments for method apply: (implicit context: com.example.services.components.MyContext, implicit m: play.api.i18n.Messages)play.twirl.api.HtmlFormat.Appendable in class edit. 
[error] Unspecified value parameter m. 
[error]  Ok(views.html.websites.edit(model)(request.context)) 
[error]         

ho provato passando nei messageApi come:

Ok(views.html.websites.edit(model)(request.context, messageApi)) 

Ma poi un errore di mancata corrispondenza di tipo tra i messaggi e MessageApi.

Cosa dovrei fare?

PS Non sto anche utilizzando messaggi in mio punto di vista, ma io sto usando gli aiutanti Form che presumo che i messaggi di uso sotto le coperte ...

risposta

9

Sembra che si sta cercando di passare un parametro implicito esplicitamente e l'altro implicitamente. Bisogna o entrambi passare esplicitamente:

Ok(views.html.websites.edit(model)(request.context, implicitly[Messages])) 

O entrambe implicitamente:

implicit val context = request.context 
Ok(views.html.websites.edit(model)) 
+0

sarebbe possibile aggiungere il 'implicita val contesto = request.context in myActionWithContext in qualche modo? Perché ogni azione avrà questo codice e se posso evitare di aggiungerlo a tutte le mie azioni sarebbe fantastico. – Blankman

+1

Dovresti essere in grado di scrivere un tratto che contiene qualcosa come "implicit def request2Context (richiesta implicita: ContextAwareRequest): MyContext = request.context', quindi mixare quel tratto in modo simile a come stai mixando in' I18nSupport'. Vedi questo per l'ispirazione: https://github.com/playframework/playframework/blob/master/framework/src/play/src/main/scala/play/api/i18n/I18nSupport.scala#L26 – danielnixon

+2

o aggiungi semplicemente che ' def' al tuo 'BaseController'. – danielnixon