我还是Grails和GORM的新手,我对此感到困惑,无法弄清楚我做错了什么。目的是通过Grails的Shiro插件自动将记录与登录用户相关联。
Class User { static hasMany = [stuff: Stuff] }
Class Stuff { static belongsTo = [user:User] }
Class StuffController {
def create = {
params.put('user', User.createCriteria().get{eq('username',SecurityUtils.subject.principal)}.id)
def stuffInstance = new Stuff(params)
stuffInstance.save()
}
}
我在create scaffold的generate-views版本中看到相关字段被称为name =“user.id”,但它和变体(例如user_id)似乎都不起作用。对Users域的查询返回必要的记录id,并且当我渲染到测试页面时,此上下文中的params.put似乎正确地用新值附加 params 对象(所以我猜它不是一成不变的,但这是我从save()获得的:
Property [user] of class [class org.stuffing.Stuff] cannot be null
我甚至试过翻过它并走另一条路,结果相同:
User.createCriteria().get{eq('username',SecurityUtils.subject.principal)}
.addToStuff(new Stuff(params))`
.save()
任何人都可以告诉我这里我缺少的东西吗?
谢谢!
修改: 显然我是脑死亡;我重写了“create”方法,但默认操作是_form.gsp模板中的“save”,因此它没有执行该分支。
从好的方面来说,我确实通过下面的Burt了解了动态查找器,所以它不是完全清洗。
谢谢你的时间,伙计们!
答案 0 :(得分:1)
您的代码可以更清晰 - 没有理由在这里使用createCriteria。如果您使用用户名搜索,请使用动态查找器:
def stuffInstance = new Stuff(params)
def user = User.findByUsername(SecurityUtils.subject.principal)
stuffInstance.user = user
if (!stuffInstance.save()) {
// inspect stuffInstance.errors
}