0

我还是 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()
  }
}

我在创建脚手架的 generate-views 版本中看到相关字段被称为 name="user.id",但它和变体(例如 user_id)似乎都不起作用。对用户域的查询返回必要的记录 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 了解了动态查找器,所以这并不是一个彻底的清洗。

谢谢你们的时间,伙计们!

4

1 回答 1

1

您的代码可以更简洁——这里没有理由使用 createCriteria。如果您按用户名搜索,请使用动态查找器:

def stuffInstance = new Stuff(params)
def user = User.findByUsername(SecurityUtils.subject.principal)
stuffInstance.user = user
if (!stuffInstance.save()) {
   // inspect stuffInstance.errors
}
于 2013-03-05T04:04:49.457 回答