5

私は Play フレームワークを使用しており、コントローラー アクションでフォームを使用してモデルを更新する一般的なユース ケースがあります。しかし、モデルのすべてのプロパティを含むフォームがある場合にのみ機能するため、その背後にある概念を理解するのにいくつか問題があります。ユーザー モデルのパスワードのみを編集するなど、部分的なフォームしかない場合、このメソッドはモデルの他のプロパティを null に設定するため、モデルを破棄します。その問題に対する「公式の」解決策はありますか?Play が既存のプロパティだけを更新する方法はありますか?

public static Result update(Long id) {
    Model model = Model.findById(id);
    Form<Model> filledForm = modelForm.bindFromRequest();
    if (filledForm.hasErrors()) {
        return badRequest(edit.render(filledForm));
    } else {
        model.update();
        flash("message", "Created new Model!");
        return ok(index.render());
    }
}

おそらく解決策は、文字列や文字列のマップなどの追加のパラメーターを使用して bindFormRequest() メソッドを呼び出すことができるという事実にありますか? しかし、私はその目的を見つけることができません。それについての洞察も素晴らしいでしょう。どうもありがとう!

4

3 に答える 3

7

最近のプロジェクトでは、この種の機能が必要であり、(元の Play フォームに基づいて) Form クラスを再実装して、bindFromRequest()メソッドに追加のパラメーターを許可する必要がありました。

コードを例にとると、次のようになります。

Model model = Model.findById(id);
Form<Model> filledForm = CustomForm.form(Model.class).bindFromRequest(model);

アイデアは、フォームで定義されたフィールドのみを変更し、モデルの他のフィールドを変更しないようにすることです。

この特定のバインディングを許可するには、bind(Map<String,String> data, String... allowedFields)メソッドを (とともにbindFromRequest) 次のように再定義する必要があります。

public Form<T> bind(T instance, Map<String,String> data, String... allowedFields) {

    DataBinder dataBinder = null;
    Map<String, String> objectData = data;
    if(rootName == null) {
        dataBinder = new DataBinder(instance);
    } else {
        dataBinder = new DataBinder(instance, rootName);
        objectData = new HashMap<String,String>();
        for(String key: data.keySet()) {
            if(key.startsWith(rootName + ".")) {
                objectData.put(key.substring(rootName.length() + 1), data.get(key));
            }
        }
    }

標準の Play Form クラスのようにDataBinderwithを作成する代わりに、モデル インスタンスをコンストラクタ引数として作成します。blankInstance()

于 2013-06-21T08:44:58.593 に答える
0

tuplescala と java の両方を 1 つのプロジェクトにマージできるため、scala の方向性を確認することをお勧めします。たとえば、フォームを scala にすると次のようになります。

val someForm = Form(tuple("user_id" -> number, "password"->text))リクエストから、それを使用してモデルの更新を実行できます。

someForm.bindFromRequest.fold(
formWithErrors => {
BadRequest
},

data => {
// update method takes two parameters user_id and password to update
User.updatePassword(data._1,data._2)
Ok("...")
}
)
于 2013-06-21T10:18:34.813 に答える