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()
  }
}

create-viewsバージョンのcreatescaffoldで、関連するフィールドが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を介して動的ファインダーについて学習したので、それは完全な洗浄ではありませんでした。

お時間をいただきありがとうございます。

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 に答える