當你在一個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
。
你是什麼意思與「我想要做的代碼」和「我評論過的方法」?你是否從控制器中刪除它? – kmera
請發佈你的控制器的代碼,否則我們只能猜測你做了什麼。 – kmera