Я использую Play 2.3.7, и я в основном имеют один и тот же вопрос, как это, но я использую Java, и я не знаю, Scala.
В моем случае у меня есть класс CSVData
с атрибутом name
который я хочу быть уникальным. В моих действиях контроллера для create()
и update(Long id)
я привязываю форму к этому классу с помощью
Form<CSVData> formData = Form.form(CSVData.class).bindFromRequest();
Как поясняется в документации Play, функция validate()
bindFromRequest()
. Здесь моя текущая функция проверки:
public List<ValidationError> validate() {
List<ValidationError> errors = new ArrayList<ValidationError>();
// Unique validation on name
if(CSVData.find.where().eq("name", getName()).findRowCount() != 0) {
errors.add(new ValidationError("name", "Name must be unique. That value is already taken."));
}
// other stuff
}
Очевидно, что проблема с моим текущим решением заключается в том, что при вызове update()
в базе данных уже есть строка с этим именем. Этот ответ предполагает проверку атрибута id
объекта в действии контроллера, а затем предоставляет фрагмент кода Scala, но этот пример содержит класс User, а мое приложение - нет. Как я могу проверить, совпадает ли объект в базе данных с совпадающим name
который я сейчас обновляю? Должен ли я проверить это в функции validate()
или в моем контроллере?
Невозможно выполнить различные проверки для create()
и update()
в функции validate()
в модели, но вы можете выполнять проверки в соответствующих действиях контроллера, например
public static Result create() {
Form<CSVData> formData = Form.form(CSVData.class).bindFromRequest();
}
public static Result update() {
Form<CSVData> formData = Form.form(CSVData.class).bindFromRequest();
if( !formData.hasErrors() ){
if(formData.field("name").value().equals( .... ) {
// do some check here
// add ValidationError if needed
}
}
}
Раньше я не рассматривал выполнение проверок непосредственно в контроллере, но это возможно.
Создайте два отдельных класса: один для insert()
- InsertCsvData
и один для updated()
- UpdateCsvData
с двумя различными реализациями validate()
. При желании, создайте базовый класс для хранения общих свойств/поведения.
CSVData
, тогда в моем шаблоне представления я хотел бы передать @(csvForm: Form[CSVData])
. Однако я получаю ошибку компиляции для несоответствия типов. Note: models.InsertCSVData <: models.CSVData, but Java-defined class Form is invariant in type T.
Как бы я изменил шаблоны представления Scala, чтобы они принимали форму типа базы? класс?
@(csvForm: Form[_ <: CSVData])
scala: @(csvForm: Form[_ <: CSVData])