0

Grails 2.2.0

私はgrailsとajaxを探索していて、多分私は熱心なajaxアダプターですが、それは本当にゲームチェンジャーだと思うので、真っ先に進んでいます。

データモデルはマスターディテール(1:n)です。クライアントのテーブルには、マスターのプロパティのリストの一部が表示されます。クリックすると、線が折りたたまれて開き、すべての詳細(属性ドメイン)と、展開されたマスターに新しい詳細を追加するオプションが表示されます。さて、この回線を開くと

def show (Long id) {
    def product = Product.get(id)
    log.info('show ' + (request.xhr ? 'xerhr' : 'normal') + "product is ${product.title}")
    def c = Attribute.createCriteria();
    def attributeTypes = LookupValue.findByType('m_attr') //list of values for dropdown menu.
    def result = c {
        eq("movie", product)
    }
    for (attr in result) {
        log.info('value: ${attr.value}')
    }
    render ([template: "attributes", model:[focus:params.id
        , attributeList: result, attributeTypes: attributeTypes]])
}

属性テンプレートには、関連するすべての属性(詳細)が表示され、最後に追加オプションが表示されます。ここで、新しい値を入力して、ドロップダウンメニューから値を選択できます。クライアントは、この新しい属性を保存するために、コントローラーのsaveAttributeメソッドにajaxポストを返します。

def saveAttribute(Long id, Long luv_id, String value) {
    def attribute = new Attribute(movie : Product.get(id)
        , label : LookupValue.get(luv_id)
        , value : value);
    attribute.save();
    show();
}

もう一度呼び出しshow()て、新しく作成された属性のリストをクライアントにレンダリングします。これで、show()は既存のすべての属性をレンダリングしますが、作成されたばかりの属性を取得できませんが、データベースに確実に格納されます。ページをリロードしたときにも表示されます。どこが間違っているのですか?Hibernateを使用すると、これを克服するために何かを行うと思いますsession.flush()

そして、おそらく私のアーキテクチャが間違っていて、サービスを定義し、いくつかのトランザクション境界を導入する必要がありますか?

4

1 に答える 1

1
def saveAttribute(Long id, Long luv_id, String value) {
    Attribute attribute = new Attribute(movie: Product.get(id)
        , label: LookupValue.get(luv_id)
        , value: value).save(flush: true)
    forward(action: "show", id: id)
}
于 2013-01-28T03:21:45.593 に答える