@Repeat Form Helper with complex object - Play Framework

Mik*_*ike 5 java forms scala playframework-2.0 bootstrap-form-helper

根据我模型中的数据,我无法设置具有选定值的重复字段.

目前我在我的用户模型中:

@Required
public String username;

@ManyToMany
public List<Stay> places;
Run Code Online (Sandbox Code Playgroud)

而我的Stay模型:

@Required
@ManyToOne
public Place place;

@Required
@Formats.DateTime(pattern="yyyy-MM-dd")
public Date startDate;

@Required
@Formats.DateTime(pattern="yyyy-MM-dd")
public Date endDate;
Run Code Online (Sandbox Code Playgroud)

我的Scala视图形式:

    @(formUser: Form[User])
...
    @repeat(formUser("places"), min = 1) { stayField =>
      <div id="groupLocationField">
        // Don't manage to reach User->Places->Place
        @select(formUser("stayField.places"), options(Place.optionsTitle))
        @inputDate(formUser("stayField.startDate"))
        @inputDate(formUser("stayField.endDate"))
      </div>
    }
Run Code Online (Sandbox Code Playgroud)

stayField是一个包含的Form.Field类型 Field(null,places[1],ArrayBuffer(),None,ArrayBuffer(),Some(Paris Mon Oct 29 00:00:00 CET 2018 Wed Jun 11 00:00:00 CEST 2014 null))

但似乎已将我的地方和日期转换为字符串.@stayField包含我的Stay模型toString方法的值.

@stayField.value = Paris Mon Oct 29 00:00:00 CET 2018 Wed Jun 11 00:00:00 CEST 2014
@stayField.value.productArity = 1
Run Code Online (Sandbox Code Playgroud)

Mik*_*ike 8

找到解决方案:

 @repeat(formUser("places"), min = 1) { stayField =>
      <div id="groupLocationField">
        @select(formUser(stayField.name.toString + ".place"), options(Place.optionsTitle))
        @inputDate(formUser(stayField.name.toString + ".startDate"))
        @inputDate(formUser(stayField.name.toString + ".endDate"))
      </div>
    }
Run Code Online (Sandbox Code Playgroud)

stayField.name将显示地点[1],地点[2]等...

请注意,我必须使用Place.optionsTitle而不是我在其他@select字段中使用的经典Place.options.

    public static Map<String,String> optionsTitle() {
        LinkedHashMap<String,String> options = new LinkedHashMap<String,String>();
        for(Place c: Place.find.orderBy("title desc").findList()) {
            options.put(c.title, c.title);
        }
        return options;
    }   
    public static Map<String,String> options() {
        LinkedHashMap<String,String> options = new LinkedHashMap<String,String>();
        for(Place c: Place.find.orderBy("title desc").findList()) {
            options.put(c.id.toString(), c.title);
        }
        return options;
    }
Run Code Online (Sandbox Code Playgroud)

编辑:事实上我没有必要使用特定的方法optionsTitle(),我忘了在我的选择中指定地点ID:

@select(formUser(stayField.name.toString + ".place"), options(Place.optionsTitle))
Run Code Online (Sandbox Code Playgroud)

应该成为:

@select(formUser(stayField.name.toString + ".place.id"), options(Place.options))
Run Code Online (Sandbox Code Playgroud)