2014-01-18 69 views
-1

我初學Grails和我有一個問題,當我嘗試保存POGO操作Grails中節省一POGO

我已經創建了1個域類

class Book { 
    String title 
} 

然後,我已經產生控制器和視圖自動。 現在,我希望能夠通過點擊「創建」(我知道它可以直接與代碼生成的代碼,但我的例子我想通過代碼來完成)來創建一本書。要做到這一點,我已經在控制器修改的方法「保存(圖書bookInstance)」這樣的

@Transactional 
def save(Book bookInstance) { 
    def book = new Book(title:"New Grails Book").save() 

但是,當我去到URL本地主機:8080 /對myApp /書/創建,然後我點擊「創建」,我有錯誤

message -> /myApp/WEB-INF/grails-app/views/book/save.jsp 
description -> The requested resource is not available. 

當我把這個代碼在引導,這是確定的,所以我不明白爲什麼它不在控制器

+0

你是什麼意思與「我想要做的代碼」和「我評論過的方法」?你是否從控制器中刪除它? – kmera

+0

請發佈你的控制器的代碼,否則我們只能猜測你做了什麼。 – kmera

回答

4

當你在一個hasMany屬性一個域類,Grails增加了一個Set屬性到AST類轉換的域類離子(所以它實際上存在於字節碼中,並且它對Java很敏感)來表示集合,並且當添加belongsTo時,將添加該類型的字段。因此,它是,如果你有這樣的代碼:

class Author { 
    Set<Book> books 
    static hasMany = [books: Book] 
    String name 
} 

class Book { 
    Author author 
    static belongsTo = [author: Author] 
    String title 
} 

的AST的XForm使用映射鍵字段名,所以你可以使用任何有效的字段名,但慣例是做你做的事。

屬性默認爲nullable:false,所以您的代碼不會保存Book實例,因爲您沒有設置author屬性。明確地做這些時,通常不直接創建Book,而是使用動態addToBooks方法將其添加到Author的集合中。這將設置author字段的反向引用,並且當您保存作者時,該書會被傳遞驗證並保存。如果您的代碼爲new Book(params).save(),您可以直接進行處理,例如

Author author = ... 
def book = new Book(title:"New Grails Book", author: author).save() 

如果您使用的是生成控制器和GSP,應該有在params地圖的作者ID,它很可能是author.id,使第一線將

Author author = Author.get(params['author.id']) 

但您可以添加

println params 

在操作方法的頂部查看所有提交的參數。

一般而言,您不想查看save調用的返回值,因爲如果存在驗證錯誤並且無法檢索錯誤,則它將爲空。因此,改變

def book = new Book(...).save() 

def book = new Book(...) 
book.save() 

,現在你可以調用book.hasErrors()book.getErrors()book.errors等,看它是否是成功的,如果沒有,哪裏出了問題。

但是,這不是你看到的確切問題,只有一個你會解決你的問題。沒有save.gsp,而且Grails也尋找save.jsp,並在未找到的消息中混淆地包含該名稱。通過POST請求訪問save方法,通常來自create動作生成的表單,並且在驗證失敗時重新顯示create.gsp以提供數據和錯誤消息,或在保存成功時重定向至view操作。使用生成的代碼時,不需要save.gsp