Grails 将自动从域类创建一个 id 和一个版本列。我想使用我自己的列作为主键。所以,我按照文档更改映射。
class book {
String isbn
static mapping = {
id generator: 'assigned', name: 'isbn'
}
}
到现在为止还挺好。 isbn 列现在是主键。我使用 generate-all 创建 View 和 Controller 。但是,数据绑定(bind)将不再起作用。
创建和保存工作没问题。它将一本书绑定(bind)到 View 。我可以在数据库中添加一本新书没问题。
def create() {
respond new Book(params)
}
def save(Book book) {
if (book == null) {
notFound()
return
}
...
}
但更新操作不绑定(bind)。在我单击编辑 View 中的更新按钮后,书为空。def update(Book book) {
if (book == null) {
notFound()
return
}
...
}
在 Save 和 Update Action 中 generate-all 生成的代码是一样的。我不明白为什么它将书绑定(bind)到保存操作而不是更新操作。你能告诉我这个问题吗?
非常感谢!
最佳答案
我想我想通了。当我将对象绑定(bind)到 View 时,Grails 被硬编码以查找 编号 属性(property)。它必须拼写为“id”。如果域类中没有“id”属性,Grails 将不会绑定(bind)。
我解决这个问题的方法是查看服务器生成的实际 HTML。
如果有一个 id 属性绑定(bind)到 View ,我看到 HTML 有 ../ Controller / Action /id 关联。
如果缺少 id 属性,则 HTML 链接只是 ../ Controller /索引
我是 Grails 的新手。所以,我想为了让绑定(bind)工作,我需要一个 id 属性供 Grails 放入链接。
我认为这是一个 REST 调用。我不知道 REST 是什么。
因此,我将尝试在我的 Book 域类中添加一个虚拟 id 属性,以查看 Grails 是否会上钩。我将设置域,以便 Grails 不会在数据库表中生成 id 列。 id 属性仅在本地使用。无需将其保存到数据库中。
class book {
String isbn
String id
static mapping = {
id generator: 'assigned', name: 'isbn'
}
}
我将 isbn 值复制到 id 属性。我不确定这是否可行。我希望 Grails 将在 View 中使用 id 属性中的 isbn 字符串而不是默认的整数 id 值生成链接。../ Controller / Action /978-3-16-148410-0
关于如果重命名 id 列,Grails 数据将不会绑定(bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64458991/