2010年2月16日

GORM 物件於 update method 後立即顯示資料

在學習 Grails 的過程中, 剛開始會比較專注於 scaffold 的樣板, 並從中去了解 GORM 物件的操作。
不知有沒有人發現, 在 update action 中的處理:
{
    ...
    if (!someInstacne.hasErrors() && someInstance.save()) {
        ...
        redirect(action: show, someInstance.id)
    }
    ...
}
往往在 show view 所查看到的 GORM 物件並非是剛剛 update 後的資料; 所以解決的方法是:
變更 save method 的參數: flush 為 true; 即
if (!someInstacne.hasErrors() && someInstance.save(flush: true)) {
        ...
但是, 每每在一個 GORM 物件進行 generate-all 後, 得再加以修改該行參數, 顯然不是一個經濟的做法。
於是進行預設 templates 的修訂來達到此一目的是合乎情理的。方法如下:

1) 先安裝 plug-in
grails install-templates
2) project 下, 找出預設 controller 的樣板
vi src/templates/scaffolding/Controller.groovy
3) 修改...
if (! ${propertyName}.hasErrors() && ${propertyName}.save()) {
        ...
    變更為...
if (! ${propertyName}.hasErrors() && ${propertyName}.save(flush: true)) {
        ...
4) 存檔完成

如此, 每當產生預設的 controller 之後, 都會含有此一作用; 省去為每個 controller 要加註 flush 參數。

不過 v1.3.x 版已加了上述的處理了。

沒有留言: