2013-09-27 14 views
7

なぜsimple_formがブール型フィールドの入力タグを2回生成するのですか(非表示と非表示)私simple_formでSimple_form:なぜ2つの入力タグが1つではなく生成されるのですか?

、私はこれを持っている:あなたが見ることができるように

<div class="control-group boolean optional order_over_phone"> 
    <label class="boolean optional control-label" for="order_over_phone">Order over phone</label> 
    <div class="controls"> 
    <input name="order[over_phone]" type="hidden" value="0"> 
    <label class="checkbox"> 
     <input checked="checked" class="boolean optional" id="order_over_phone" name="order[over_phone]" type="checkbox" value="1"> 
    </label> 
    </div> 
</div> 

、一つの入力タグが0の値と他で隠されている:この生成

<%= form.input :over_phone, as: :boolean, input_html: {checked: true} %>

1の値で非表示になります。 フォームを送信すると、ポストパラメータで、私は両方の値を取得します:

order[over_phone]:0 
order[over_phone]:1 

私はこのブール値フィールドに関連付けられたモデル作成でいくつかのランダムな動作があるので、simple_formによって引き起こされているのだろうかと思います。これは、非ブール型のフィールド型では発生しません。

同様の問題が発生した場合は、あなたの経験を共有してください。

私はsimple_form 2.1.0を使用しています。

答えて

8

CHECK_BOXの落とし穴

http://api.rubyonrails.org/classes/ActionView/Helpers/FormHelper.html#method-i-check_box

HTMLの仕様では、未チェックのチェックボックスが成功していないと言うので、Webブラウザは、それらを送信しません。残念ながら、これは、問題をもたらします。つまり、請求書モデルに有料フラグがあり、有料の請求書を編集する形式で、ユーザーがチェックボックスをオフにすると、有料のパラメーターは送信されません。だから、

@invoice.update(params[:invoice]) 

のような質量割り当てのイディオムは、フラグを更新しません。

これを防ぐため、ヘルパーは非常にチェックボックスの前にの補助隠しフィールドを生成します。 隠しフィールドは、同じ名前を持ち、その属性は未チェックのチェックボックスを模倣しています。

このようにして、クライアントは(チェックボックスのチェックを外す)または両方のフィールドののみを送信します。 HTML仕様では、キー/値のペアはフォームに表示される順序と同じ順序で送信する必要があるため、パラメータ抽出では、通常のフォームで使用できるクエリー文字列の最後の繰り返しキーが取得されます。

+0

ありがとうございました!これはそれを説明します。私はちょうど考え出した、 "over_phone"フィールドの私の問題はどこかにあった。 – Nurbo

関連する問題