7

simple_form がブール値フィールドに対して入力タグを 2 回生成するのはなぜですか (一方は非表示、もう一方は非表示)。

私のsimple_formには、これがあります:

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

これはこれを生成します:

<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 で非表示になり、もう一方は値 1 で非表示になります。フォームを送信すると、post パラメータで両方の値を取得します。

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

このブール値フィールドに関連付けられたモデル作成でランダムな動作が発生するので、simple_form が原因なのだろうかと思います。これは、ブール値以外のフィールド タイプでは発生しません。

同様の問題に遭遇したことがある場合は、経験を共有してください。

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

4

1 に答える 1

9

check_box 落とし穴

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

HTML 仕様では、チェックされていないチェック ボックスは成功しないと規定されているため、Web ブラウザーはチェック ボックスを送信しません。残念ながら、これには落とし穴があります。Invoice モデルに有料フラグがあり、有料請求書を編集するフォームでユーザーがチェック ボックスをオフにすると、有料パラメーターは送信されません。したがって、次のような大量割り当てイディオム

@invoice.update(params[:invoice])

フラグを更新しません。

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

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

于 2013-09-27T11:49:11.100 に答える