我正在使用Play 2.3.7,我基本上和this有相同的问题,但我使用的是Java而我不知道Scala。
在我的情况下,我有一个CSVData
类,其中name
属性我想要是唯一的。在create()
和update(Long id)
的控制器操作中,我使用
Form<CSVData> formData = Form.form(CSVData.class).bindFromRequest();
正如Play documentation中所述,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()
被调用时,DB中已经有一行具有该名称。 This answer建议检查控制器操作中对象的id
属性,然后提供Scala代码段,但该示例包含User类,而我的应用程序则不包含。如何检查数据库中具有匹配name
的对象是否与我当前正在更新的对象相同?我应该在validate()
功能或我的控制器中检查这个吗?
答案 0 :(得分:0)
为insert()
创建两个单独的类 - InsertCsvData
,为updated()
- UpdateCsvData
创建一个具有两个不同validate()
实现的类。 (可选)创建用于存储公共属性/行为的基类。
答案 1 :(得分:0)
无法对模型中的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
}
}
}
之前我没有考虑直接在控制器中执行验证,但这是可能的。