3

play-authenticate モジュールの User モデルと私のモデルである Books の間に関係を作成しようとしています。私は play 2.0.4 を使用しており、自分のプロジェクトに play-authenticate を統合しました。私のコントローラー/アプリケーションには、getLocalUser メソッドがあります。

public static User getLocalUser(final Session session) {
    final User localUser = User.findByAuthUserIdentity(PlayAuthenticate
            .getUser(session));
    return localUser;
}

Books モデルでモデルのメソッドをオーバーライドして、書籍のレコードを追加/変更するユーザーを保存しようとしています。

public void save() {
    User logged = Application.getLocalUser(session());
    if (logged != null) {
        this.createUser = logged;
        this.modifyUser = logged;
    }
    super.save();
}

public void update(Object o) {
    User logged = Application.getLocalUser(session());
    if (logged != null) {
        this.modifyUser = logged;
    }
    super.update(o);
}

これを行うと発生するエラーは次のとおりです。

メソッド session() は、タイプ Books に対して未定義です。

インポートのためにコントローラー/アプリケーションメソッドにアクセスできるため、これがどのようになるかはわかりません。

コントローラーをインポートします。アプリケーション;

アップデート: *

public static Result createBook() {
        Form<Book> filledForm = bookForm.bindFromRequest();

        if(filledForm.hasErrors()) {
            return badRequest(
                views.html.bookCreator.render(Book.all(), filledForm)
            );
        }
        else {
            Book.create(filledForm.get());
                    //Book.save(getLocalUser(session()));
            return redirect(routes.Application.createSuccess());
        }
    }*
4

1 に答える 1

2

まず、モデル クラス内で呼び出すのは非常に悪い考えsession()です。これを行うと、ある種の循環的な依存関係 (プレゼンテーション レイヤー -> モデル -> プレゼンテーション レイヤー) が作成されるためです。

本当にこのままにしておきたい場合は、次のようにしてください。

コントローラ:

public static User getLocalUser() {
    final User localUser = User.findByAuthUserIdentity(PlayAuthenticate
            .getUser(session()));
    return localUser;
}

モデル:

public void save() {
    User logged = Application.getLocalUser();
    if (logged != null) {
        this.createUser = logged;
        this.modifyUser = logged;
    }
    super.save();
}

public void update(Object o) {
    User logged = Application.getLocalUser();
    if (logged != null) {
        this.modifyUser = logged;
    }
    super.update(o);
}

しかし、私はこれを行うことを好みます:

コントローラ:

public Result anAction() {
    ...
    save(getLocalUser(session()));
    ...
}

モデル:

public void save(final User logged) {
    if (logged != null) {
        this.createUser = logged;
        this.modifyUser = logged;
    }
    super.save();
}

public void update(Object o, final User logged) {
    if (logged != null) {
        this.modifyUser = logged;
    }
    super.update(o);
}
于 2013-03-31T19:12:14.863 に答える