1

我有两个模型之间的映射,Movie并且Place. 当我现在创建一个从movieForm并填写一个已经创建Movie并打开的视图时,movieForm会填充一个包含所有文本字段和选择的视图,除了映射PlaceMovie. 在下面的示例中,在视图的“选择”中选择了正确的类别,但未选择该地点。

可能是什么问题?我该如何解决这个问题?


电影模特

@Entity
public class Movie extends Model {

    @Id
    public Long id;
    ...
    @Required
    @Formats.NonEmpty
    public EnumCategorie categorie = EnumCategorie.FILM;
    @ManyToOne
    public Place place;

    ...
}

放置模型

@Entity
public class Place extends Model {
    @Id
    public String name;
    ...
}

控制器

public class Movies extends Controller {
    public static Result edit(Long id) {
        Movie movie = Movie.find.byId(id);
        Form<Movie> movieForm = form(Movie.class).fill(movie);
        return ok(movieCreate.render(movieForm,
                placeForm, "edit"));
    }

风景

@form(routes.Movies.save(option)) {
        <fieldset>
        ...
        @select(movieForm("categorie"),
            options(Movie.categories),
            '_label -> "Categories", '_default -> "-- Choose a categorie --",
            '_showConstraints -> false,
            'class -> "controls")
        @select(movieForm("place"),
            options(Place.places),
            '_label -> "Places", '_default -> "-- Choose a place --",
            '_showConstraints -> false,
            'class -> "controls")
        ...
        </fieldset>

4

1 回答 1

0

我猜你错过了Place.java模型上的这行代码。该模型可能如下所示:

放置模型

@Entity
public class Place extends Model {
   @Id
   public String name;

   ... // the rest of fields

   // Sample of all Places data as value of select option in views
   public static List<String> places() {
      List<String> all = new ArrayList<>();
      all.add("INA"); // Place.name = "INA"
      all.add("BEL"); // Place.name = "BEL"
      all.add("KOR"); // Place.name = "KOR"
      return all;
   }

   // You missed this 
   public String toString() {
      return name; // return Place.name
   }
}

好的,现在这就是解释。让我们在以下位置查看您的视图代码:

@select(movieForm("place"), options(Place.places), ...)

唯一适用于以下options(...)数据类型(取自 play2 源):

def apply(options: (String, String)*) = ...
def apply(options: Map[String, String]) = ...
def apply(options: java.util.Map[String, String]) = ...
def apply(options: List[String]) = ...
def apply(options: java.util.List[String]) = ...

因为你在Movie类上的 place 字段是Place对象而不是String对象,所以它应该表示为String. 您可以定义它的方式是覆盖对象toString()上的方法Place,因此它将Place.name值(模型的 ID )表示为Place视图中选择选项的值(指使用 填充的数据Place.places())。

希望这可以帮助解决您的问题。


更新

如果我们选择不覆盖模型上的方法,我们还可以执行以下操作toString()

`@select(movieForm("place.name"), options(Place.places), ...)`

movieForm("place.name")可用于Place直接绑定具有对应输入值的 ID 值的对象。这个相关的问题可以作为这个解决方案的参考。

于 2013-04-08T02:31:51.060 回答