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ą ...
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
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
Lub po prostu dodaj, że ' def' do twojego 'BaseController'. – danielnixon