Grails:チェックボックスがfalseに戻されていない


8

グリッドビューの単一ページでコレクションのコレクションを編集するGrails(1.0.4)アプリケーションを開発しています。

グリッド内のブール値(またはそのブール値)の値は、チェックボックスで設定できますが、設定されていない場合を除いて、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

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

  0

これを行うにはあまりにも怠惰です:)おそらく最も良い長期的な解決策でしょう。 01 3月. 092009-03-01 13:00:26


1

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

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

  0

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

  0

あなたがリンクしたバグは別の問題です、私は思う - 基本的に、HTMLとgrailsの "value"属性の異なる意味に基づく誤解。 01 3月. 092009-03-01 13:02:59

  0

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

  0

あなたが投稿している解決策では、カスタムタグコ​​ードを見て、value属性が生成されない理由を見てください。その属性をHTMLで記述すると、この問題は修正されると思います。 01 3月. 092009-03-01 20:24:47

  0

私はMr.GとGraemeの意見をここで得ようとしています。 01 3月. 092009-03-01 20:29:47

  0

いいえ、チェックされていないチェックボックスの場合、HTMLは何も送信しません(チェックされていないチェックボックスの場合は、指定されていない場合はデフォルト値として "on"を使用します)。隠しフィールドはその回避策です。 02 3月. 092009-03-02 10:45:23

  0

そして、私が理解する限り、grailsの "value"属性はHTMLとはまったく異なる意味を持っています - grailsでは、フォームのチェックボックスを設定するかどうかを決定します。 HTMLでは、チェックボックスが設定されている場合、サーバーに送信される文字列です。 02 3月. 092009-03-02 10:49:01

  0

@Michael:チェックされていないチェックボックスはチェックしないと送信しません(HTMLの通常の動作です)。それを欠落している人のために隠し値を設定します。 02 3月. 092009-03-02 23:33:24

  0

Grailsは隠しフィールドを使用して、同じ名前のチェックボックス(アンダースコア)がリクエストparamsに存在しない場合、チェックボックスがオフになっていると推測します。通常のフィールドでは動作しますが、何らかの理由でインデックスフィールドで失敗します。 03 3月. 092009-03-03 00:28:31


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に設定する必要があることを意味します。 01 3月. 092009-03-01 13:05:53


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>