0

hasManyデータバインディングを使用してフォームを介して関係を更新しようとしていますが、取得したデータparamsが正しくないようです。

ドメインクラス:

class CustomerSite {

static hasMany = [dhrs:DeviceHistoryRecord];

static mapping = {
    id generator:'sequence', params:[sequence:'cs_seq']
}
    ...
}

ビューの編集:

...
<g:select name="dhrs" id="dhrs" 
from="${DeviceHistoryRecord.list()}"
multiple="multiple"
optionKey="id"
value="${customerSiteInstance?.dhrs}"/>

コントローラ:

def update = {
    def customerSiteInstance = CustomerSite.get( params.id )
    if(customerSiteInstance) {

        customerSiteInstance.properties = params

        String flashMsg = new String();

        flash.message = "";

        if(!customerSiteInstance.hasErrors() && customerSiteInstance.save()) {
            flash.message += "Customer Site ${customerSiteInstance.toString()} updated"
            redirect(action:show,id:customerSiteInstance.id)
        }
        else {
            flash.message = flashMsg
            render(view:'edit',model:[customerSiteInstance:customerSiteInstance])
        }
    }
    else {
        flash.message = "Customer Site not found with id ${params.id}"
        redirect(action:edit,id:params.id)
    }
}

これは私にエラーを与えます:

エラー200:org.springframework.beans.NotReadablePropertyException:Beanクラス[java.lang.String]の無効なプロパティ'currentDeviceData':Beanプロパティ'currentDeviceData'が読み取れないか、無効なgetterメソッドがあります:getterの戻り型が一致していますかセッターのパラメータータイプ?

コントローラコードのこの行で:

if(!customerSiteInstance.hasErrors() && customerSiteInstance.save()) {

それは私には意味がありませんが、私はそれを(実際にはたくさん)だまして、最終的にg:selectはインデックスのコレクションをparamsに渡していることに気づきました。

ビューは、私が正しいと思うコードを出力します。

<select name="dhrs" id="dhrs" multiple="multiple" >
  <option value="2421" >801122</option>
  <option value="2422" >801123</option>
  ...

リストのインデックス0とインデックス1のアイテムを選択した場合、期待どおりに「2421」と「2422」のセットが渡されません。「0」と「1」を渡します。さらに悪いことに、それを実行した後、編集ページに戻ってもう一度実行すると、今度はインデックス8で何かを選択すると、「8」が表示されますが、「0」と「1」も表示されます。 「前回から。

ここを少し見てみると、selectタグから複数の値を選択していることがわかりました-Grails。これには、次のような変更を加えるなど、他のアイデアがいくつかあります。

<g:select name="dhrs.id" 
  from="${DeviceHistoryRecord.list()}" 
  multiple="multiple" 
  optionKey="id" 
  value="${customerSiteInstance?.dhrs*.id}"/>

しかし、実際の値が返される代わりにインデックスが返される問題は修正されましたが、メソッドエラーがありませんでした。

ここで何が起こっているのか、どうすれば修正できるのかについてのアイデアはありますか?

ところで、私はGrailsのバージョン1.0.4を実行しています。はい、アップグレードしたいのですが、できません。

ありがとう!

4

2 に答える 2

1

私はこれにより多くの時間を費やし、部分的な解決策を得ました。これが私が最終的に得たものです:

<g:select name="dhrsX.id" 
          from="${DeviceHistoryRecord.list()}"
          multiple="multiple"
          optionKey="id"
          value="${customerSiteInstance?.dhrs*.id}"/>

dhrsXそれは-ではないことに注意してくださいdhrs。そうすれば、オブジェクトに設定する前に、それぞれを手動で検索できCustomerSiteます。唯一の複雑な点は、ユーザーが1つのアイテムを選択した場合、;dhrsXが含まれることです。Stringユーザーが複数のアイテムを選択した場合dhrsXは、のリストが含まれますString。これに対処するには、選択結果を直接使用する前に、選択結果を再パッケージ化する必要がありました。

def update = {
    def customerSiteInstance = CustomerSite.get( params.id )
    if(customerSiteInstance) {

        customerSiteInstance.properties = params
        customerSiteInstance.dhrs.clear()

        for(thisDHR in params.dhrsX) {
            def value = thisDHR.getValue()
            def ArrayList<String> list = new ArrayList<String>();
            if (value instanceof String) {
                list.add(value)
            } else {
                for(oneValue in value) {
                    list.add(oneValue)
                }
            }

            for(aDHR in list){
                DeviceHistoryRecord rec = DeviceHistoryRecord.get(aDHR)
                if (rec != null) {
                    customerSiteInstance.addToDhrs(rec)
                } else {
                    print(thisDHR + " NOT FOUND!")
                }
            }
        }
...

現在、単一選択と複数選択が機能しています...しかし、まだ小さな未解決の問題があります。新しい選択を追加する前に呼び出したにもかかわらずclear()、以前の選択は残ります。dhrsただし、これを修正するのがそれほど複雑になるとは思いません。

于 2012-07-18T11:47:20.997 に答える
0

g:selectで使用:

value="${customerSiteInstance?.dhrs?.id}"

星の代わりに疑問符。これが私の「複数選択」の方法です。

于 2012-07-17T15:09:46.320 に答える