2009-02-22 3 views
8

グリッドビューの単一ページでコレクションのコレクションを編集するGrails(1.0.4)アプリケーションを開発しています。Grails:チェックボックスがfalseに戻されていない

グリッド内のブール値(またはそのブール値)の値は、チェックボックスで設定できますが、設定されていない場合を除いて、Spring MVCのインデックス付きのパラメータ処理でのみうまく動作します。つまり、チェックボックスをチェックして更新すると、値はtrueに設定されますが、後で再度編集するときにチェックボックスをオフにして更新すると、それは真のままです。私は、まさにこの効果を説明Grails bugを見つけたが、それはだ

<input type="hidden" name="tage[0].zuweisungen[0]._fixiert" /> 
<input type="checkbox" name="tage[0].zuweisungen[0].fixiert" checked="checked" id="tage[0].zuweisungen[0].fixiert" /> 

これは、チェックボックスのGSPコードです:

<g:checkBox name="tage[${indexTag}].zuweisungen[${indexMitarb}].fixiert" value="${z.fixiert}" /> 

そして、これは、生成されたHTMLです1.0.2で修正済みとマークされ、そこに記述されている問題のメカニズム(間違った場所に置かれている隠しフィールド名の下線)は私の場合は存在しません。

何が原因である可能性がありますか?

答えて

1

私は、問題を示す小さなサンプルアプリケーションを作成し、それをGrailsのバグに付け加えます(または新しいものを作成します)。ここで誰かがあなたのサンプルアプリケーションをデバッグすることができるかもしれないか、バグが本当に修正されていないことを示しているでしょう。

+0

、タグを生成するものです私はあなたが「光る」の代わりに「見せられた」という意味だと思います。 :-) –

+0

これを行うにはあまりにも怠惰です:)おそらく最も良い長期的な解決策でしょう。 –

1

最も単純な回避策は、デバッガをアタッチし、Grailsが値を入力できない理由を確認することです。 Grailsがオープンソースであることを考えると、ソースコードにアクセスできるようになります。そして、あなたのバージョンをパッチすることができれば、そのソリューションを理解することができます。

私はこの他のバグGRAILS-2861を見つけました。これはブーリアンへのバインディングに関連する問題を示しています(スレッドのMarcのコメントを参照してください)。私はそれがまさにあなたが描いている問題だと思います。

+0

残念なことに、grailsで実行されているすべての動的およびメタプログラミングの魔法は、どこから見えるか正確にわからない限り、ほとんど不可能です。おそらくSpring MVCのどこかにあります。私は実際にはわからない。 –

+0

あなたがリンクしたバグは別の問題です、私は思う - 基本的に、HTMLとgrailsの "value"属性の異なる意味に基づく誤解。 –

+0

私はまだこの2つが関連していると信じていることを告白する必要があります:-)。下に投稿したソリューションを見ると、隠れているかチェックボックスにフォームが送信されたときに送信される値(チケットで説明されている)がないという問題があるように見えます。 – alexpopescu

0

彼らは問題が表示されない場合はDEBUGにそれらすべてを反転、最初の3を試してみてください延期、DEBUGにログを設定し、これを試してみてください:

codehaus.groovy.grails.web.servlet="error" // controllers 
codehaus.groovy.grails.web.pages="error" // GSP 
codehaus.groovy.grails.web.sitemesh="error" // layouts 
codehaus.groovy.grails."web.mapping.filter"="error" // URL mapping 
codehaus.groovy.grails."web.mapping"="error" // URL mapping 
codehaus.groovy.grails.commons="info" // core/classloading 
codehaus.groovy.grails.plugins="error" // plugins 
codehaus.groovy.grails.orm.hibernate="error" // hibernate integration 

これは、あなたが正確にいつ見ることができるはずですどのようにパラメータの設定が失敗しているのか、おそらく回避策を見つけ出すでしょう。

+0

不幸なことに、私はログにヒントを見つけられませんでした。 "._fixiert"パラメータのマッピング方法はわかりませんが、ドメインモデルには存在しません。なぜなら、 ".fixiert = on"は、falseに設定する必要があることを意味します。 –

2

これは私自身の解決、手動で(ではないが、ない)データバインディングのGrailsがやるべきことは何を基本的には回避策です:

Map<String,String> checkboxes = params.findAll{def i = it.key.endsWith("._fixiert")} // all checkboxes 
checkboxes.each{ 
    String key = it.key.substring(0, it.key.indexOf("._fixiert")) 
    int tagIdx = Integer.parseInt(key.substring(key.indexOf('[')+1, key.indexOf(']'))) 
    int zuwIdx = Integer.parseInt(key.substring(key.lastIndexOf('[')+1, key.lastIndexOf(']'))) 
    if(params.get(key+".fixiert")) 
    { 
     dienstplanInstance.tage[tagIdx].zuweisungen[zuwIdx].fixiert = true 
    } 
    else 
    { 
     dienstplanInstance.tage[tagIdx].zuweisungen[zuwIdx].fixiert = false      
    } 
} 

作品、Grailsの自体には変化を必要としませんが、ISN」再利用可能です(おそらく余分な作業でそうすることができます)。

3

これはgrails-userメーリングリストで提案されたJulius Huangという男のソリューションです。再利用可能ですが、残念ながらHTMLが送信しないチェックされていないチェックボックスに対して、「偽」の応答で隠しフィールドを埋め込むためにJavaScriptを使用しています。

私は ボックス(真 - > false)を外したときに "偽" を送信するためにGSPをハック カスタムTagLibのと。 チェックを外しが、私は イベントハンドラとしてチェックボックスを使用しますが、代わりに隠しフィールド を送信するときに、デフォルトチェックボックスによって

は何も送信しません。

変更なしでコントローラの "params"は "false" - > "true"を処理できます。例えば。コントローラにはすべて同じものが残っています。

GSPのカスタムタグの使い方(サンプルusedfunc_Fが "真" である)、ここで

<jh:checkBox name="surveyList[${i}].usedfunc_F" value="${survey.usedfunc_F}"></jh:checkBox> 

<input type="hidden" name="surveyList[#{i}].usedfunc_F" id="surveyList[#{i}].usedfunc_F" value="false" /> 
<input type="checkbox" onclick="jhtoggle('surveyList[#{i}].usedfunc_F')" checked="checked" /> 

Javascriptを

<script type="text/javascript"> 
function jhtoggle(obj) { 
    var jht = document.getElementById(obj); 
    jht.value = (jht.value !='true' ? 'true' : 'false'); 
} 
</script> 
関連する問題