#scala #playframework-2.0
#скала #playframework-2.0 #scala
Вопрос:
У меня есть отображение формы, такое как следующее:
val myBaseMapping = mapping(
"email" -> email,
"password" -> text.verifying("Please provide a password", !_.isEmpty)
)(BaseModel.apply)(BaseModel.unapply)
Это представляет FormA
. У меня есть другая форма, FormB
, которая идентична, но добавляет еще пару полей. Вот как будет выглядеть его отображение:
val myExtendedMapping = mapping(
"email" -> email,
"password" -> text.verifying("Please provide a password", !_.isEmpty)
"name" -> text,
"website" -> text
)(ChildModel.apply)(ChildModel.unapply)
ChildModel
расширяет BaseModel
: добавляет 2 новых поля, name
и website
.
Я пытаюсь закодировать myExtendedMapping
таким образом, чтобы мне не приходилось дублировать определения привязки для общих полей (адрес электронной почты и пароль).
Я не уверен, какой здесь был бы синтаксис Scala. Я не знаю, как «расширить» данное отображение и добавить к нему привязки. Кроме того, я бы предпочел не добавлять специальную проверку из-за разницы в поведении. Возможно ли это или мне просто нужно дублировать код?
Комментарии:
1. К чему привязывается каждый из них?
2. Я не уверен, отвечает ли это на ваш вопрос, но чтобы использовать отображение, я делаю: Form (myMapping), а затем использую это для привязки из HTTP-запроса.
3. Я имею в виду, что
FormB
также следует привязывать кMyModel
или что-то еще? Если да, то как это будет выглядеть?4. О, я вижу: мой текущий план состоит в том, чтобы иметь другой отдельный класс модели, скажем, MyChildModel расширить MyModel для использования в сопоставлениях для формы B (добавив эти дополнительные атрибуты). Итак, другими словами, я искал способ, чтобы привязки формы были параллельны структуре объекта модели. Но я определенно открыт для лучших способов организовать это в целом.
Ответ №1:
Что вы можете сделать, так это простую композицию. Например:
case class BaseModel(email: String, password: String)
case class ChildModel(name: String, website: String, base: BaseModel)
val commonMapping = mapping(
"email" -> email,
"passwod" -> texttext.verifying("Please provide a password", !_.isEmpty)
)(BaseModel.apply)(BaseModel.unapply)
val myExtendedForm = Form[ChildModel](mapping(
"name" -> text,
"website" -> text,
"base" -> commonMapping
)
((name, website, base) => ChildModel(name, website, base)) //bind
(child => Some(child.name, child.website, child.base)) //unbind
)