2016-03-22 6 views
0

フォームを送信するときに、ラジオボックスの値を選択しないと、検証のために何もコマンドオブジェクトに送信されません。私はtextFieldsやその他の入力タイプに問題はありません。上記の例ではGrails:選択されていないときにラジオボタンがコマンドobjに入力されない

class ApplicationCommand implements Validateable { 

    Map<String,String[]> questions = new LinkedHashMap<String,String[]>(); 

    static constraints = {  
     questions validator: {val, obj, errors -> 
      for(String key : val.keySet()) { 
       errors.rejectValue("questions[${key}]",'required'); 
      } 
     } 
    } 
} 

<g:radioGroup name="cmd.questions[1]" values="['Yes']" labels="['Yes']"> 
    ${it.radio}${it.label}&nbsp; 
</g:radioGroup> 
<g:textField name="cmd.questions[2]" /> 

私が見ることを期待どのような私は両方のフィールドを空のままにして、私は次のよう

qusetions = [2: String[0]] 

を取得し提出する場合は、この問題のため

questions = [1: String[0], 2: String[0]] 

ですquestions validatorkey=1が入力されていないため、私はそれを検証できません。質問はすべてDBから取り出された動的なものなので、if !questions.contains(1)などのバリデーターには何もハードコードできません。送信時にquestionsに入力されたデータは、データがあると仮定しなければなりません。

私はラジオが選択されていない場合移入する値を強制的に隠しフィールドを追加し、唯一のラジオボタンのために、私は

1が好きどちらも2回避策を、)を発見しました。私のバリデータで恐ろしく醜い

<g:hiddenField name="cmd.questions[1]" value="-" /> 

2)、私はすべての私の質問のためのDBを照会し、手動でquestionsマップの各1の存在をチェック。バリデーターでDBクエリを避けたい。

私の2つの回避策オプションは機能しますが、私はそれらに頼らざるを得ないと感じています。

答えて

1

これはコマンドオブジェクトやGrailsの制限ではないと思います。私はそれがHTMLの限界だと思う。私は同じ質問がPHPでポップアップするのを見ます。

本質的な問題は、コマンドオブジェクトにいくつの質問があるか分からないが、それらがすべてそこにあることを確認することにあります。私は、この制限に対処するための(追加の)いくつかの方法を考えることができます。

  1. 迅速かつ簡単な方法は、あなたのフォームに質問の数を持つ単一の隠し入力を置くことであろう。また、醜い、エンドユーザによる変更にオープンしています。

  2. もう1つの選択肢は、問題の数が事前にわかっているように質問をドメインに昇格させ、コマンドオブジェクトがフィールドまたは方法で利用できるようにすることです。あなたのコマンドオブジェクトはあなたの質問をすることができます、 "そこには何人の人がいますか?"これは#2と似ていますが、コレクション全体を取得してそれを繰り返す必要はありません。これにより、各質問に対してさらに検証を行うためのパスが開かれます(例:数字のみの回答にはテキストを使用できません)。

    これはDBを押す必要がありますが、ビューからの入力に頼らずに質問の数を検証するために考えることができる唯一の方法です。素敵なことは、それを非常に浅いヒットにすることができるということです.DBを打つことは、正しく行うと非常に迅速になることがあります。

+0

多分HTMLの制限についてのあなたの点を見ていますが、その場合、すべての空のフィールドが無視されると思います。しかし、その現実は無視される唯一のラジオボタンです。空のテキストまたは選択は、依然として空の値でフォームのサブミットに渡されます。だから私はラジオボタンで奇妙なHTMLのものか、おそらく偶然や他の方法で空のラジオ入力を具体的にフィルタリングしているGrailsコアの何かがわからないのです。 –

+0

それはちょうどチェックボックスとラジオボタンです。実際、Grailsのチェックボックスタグ( '')を使用すると、この問題に対処するための隠し入力が自動的に追加されます。ラジオボタンでも同じことをしない理由はわかりません。 –

+0

あなたの入力に感謝、オプション#2これの周りの最良の方法です。 –

関連する問題