参考保存控制器中的相关记录ID()

时间:2013-03-05 03:31:37

标签: grails groovy hashmap gorm

我还是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了解了动态查找器,所以它不是完全清洗。

谢谢你的时间,伙计们!

1 个答案:

答案 0 :(得分:1)

您的代码可以更清晰 - 没有理由在这里使用createCriteria。如果您使用用户名搜索,请使用动态查找器:

def stuffInstance = new Stuff(params)
def user = User.findByUsername(SecurityUtils.subject.principal)
stuffInstance.user = user
if (!stuffInstance.save()) {
   // inspect stuffInstance.errors
}