のリストを保持するドメインクラスが必要でしたStrings
。GORMがこれを処理できないことはかなりよく知られているように思われるので、私はそれを回避しました。最初はドメインクラスでゲッターとセッターを使ってみましたが、問題が発生しました。次に、Stack Overflowで、以下に示すようにプロパティを使用afterLoad()
および書き換える方法を見つけました。これは、を永続化のために、そしてアプリで使用するために戻すことbeforeValidate()
ができるようにするためにうまく機能しました。List
String
List
class Entries {
// persisted to database
String _entry
// exposed to app
List entry
static transients = ['entry'] //don't try to persist the List
def afterLoad() {
// split the String from the database into a List
entry = _entry?.split('\\|')
}
def beforeValidate() {
// join the List into a String for persisting
_entry = entry.join('|')
}
static constraints = {
_entry maxSize:4000
}
}
これはプログラムで正常に機能します。唯一の問題は、パイプで区切られた文字列を入力しようとしても、Grailsスキャフォールディングがこれを処理できないことです。_entry
スキャフォールディングがのフォームフィールドを作成するためentry
、オブジェクトを保存しようとするとnullになる理由を理解しています。そしてbeforeValidate()
、文字列のリストに依存して機能します。
params.entry = params._entry
を呼び出す前に、を設定して、コントローラーでこれを回避しようとしましたnew Entries(params)
。[これは完璧な解決策ではないことを認識していますが、これがフォームを機能させるための最初のパスでした。]次に、テストを追加して、であるかどうかbeforeValidate()
を設定しました。基本的に:entry = _entry
entry
null
EntrancesController.groovy:
params.entry = params._entry // I added this line
def entriesInstance = new Entries(params)
Entrances.groovy:
def beforeValidate() {
if( entry == null ) entry = _entry // I added this line
_entry = entry.join('|')
}
これにより、パイプで区切られた文字列をスキャフォールドの[エントリの作成]フォームに入力して、データベースに何かを取得できるようになると思いました。
驚いたことに、コントローラーに両方のキーが含まれていることを印刷して確認したにもかかわらず、両方entry
と_entry
がnull
入っていることがわかりました。なぜこれが起こるのかわかりません。ドメインクラスにヌルが到着するように新しいキーを追加するにはどうすればよいですか?beforeValidate()
params
params
フォローアップの質問は、もちろん、スキャフォールド化されたエントリの作成フォームがデータベースに入るパイプ区切りの文字列を受け入れるようにする正しい方法は何ですか?