2015-12-14 8 views
12

Moje działania regulatora wykorzystać akcję niestandardową, która wygląda tak:Jak przekazać wiadomości, kiedy wstrzykiwać MessageApi i użyć I18nSupport cecha

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) 

Mój kontroler wygląda następująco:

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)) 
     } 

    } 

widoku strony wyglądem jak:

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


} 

otrzymuję błąd:

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]         

Próbowałem przechodzącą w messageApi jak:

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

Ale wtedy dostałem błąd niezgodności typu między wiadomościami i MessageApi.

Co powinienem robić?

PS Nie mam nawet przy użyciu wiadomości w moich poglądów, ale używam pomocników formie, która Chyba wiadomości stosować pod kołdrą ...

Odpowiedz

9

Wygląda na to, że próbujesz przekazać jeden parametr niejawny wyraźnie a drugi pośrednio. Trzeba albo przekazać je zarówno wyraźnie:

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

Albo zarówno niejawnie:

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

byłoby możliwe dodanie „niejawny val context = request.context w myActionWithContext jakoś? Ponieważ każde działanie będzie miało ten kod i jeśli będę mógł uniknąć dodania go do wszystkich moich działań, które będą świetne. – Blankman

+1

Powinieneś być w stanie napisać cechę, która zawiera coś takiego jak 'niejawny def request2Context (niejawne żądanie: ContextAwareRequest): MyContext = request.context', a następnie miksuj tę cechę podobnie jak mieszałeś w' I18nSupport'. Zobacz inspirację: https://github.com/playframework/playframework/blob/master/framework/src/play/src/main/scala/play/api/i18n/I18nSupport.scala#L26 – danielnixon

+2

Lub po prostu dodaj, że ' def' do twojego 'BaseController'. – danielnixon

Powiązane problemy