1

Playを学んでいます!To do List のチュートリアルに従っています。さて、Anorm の代わりに Squeryl を使用したいので、チュートリアルを翻訳してみましたが、実際に動作します。

それでも、私を苛立たせる小さなことが 1 つあります。これが私のモデルの関連部分です

def all: Iterable[Task] = from(tasks) {s => select(s)}

すべてのタスクを一覧表示するコントローラーの対応するアクション

def tasks = Action {
    inTransaction {
        Ok(views.html.index(Task.all, taskForm))
    }
}

ビューには、たとえば

<h1>@tasks.size task(s)</h1>

私が気に入らないのは、タスクを更新または削除するメソッドとは異なり、コントローラー アクション内でトランザクションを管理する必要があることです。

メソッドに移動inTransactionするとall、例外が発生します。

[RuntimeException: No session is bound to current thread, a session must be created via Session.create and bound to the thread via 'work' or 'bindToCurrentThread' Usually this error occurs when a statement is executed outside of a transaction/inTrasaction block] 

ビューは のサイズを取得しようとしますtasksが、トランザクションはその時点で既に閉じられているためです。

モデルでのみ Squeryl トランザクションを使用し、これらの詳細をコントローラー レベルまで公開しない方法はありますか?

4

1 に答える 1

3

良い。これは、セッション バウンド (size() メソッド) を必要とする Iterable の遅延評価のためです。これは、Iterable を List または Vector (IndexedSeq) に変換すると機能する可能性があります。

from(tasks)(s => select(s)).toIndexedSeq //or .toList
于 2012-08-02T18:37:53.810 に答える