web-dev-qa-db-ja.com

paramsにfalseとして渡す空のチェックボックスを取得する方法

いくつかの要素がチェックボックスである更新ユーザーフォームであるフォームがあります。チェックされている場合はparamsにtrueを渡し(これは機能しています)、チェックされていない場合はfalseを渡します(機能していない)。チェックされていない項目は、paramsにも送信されていません。未チェックのアイテムをfalseとしてパススルーするにはどうすればよいですか?

<%= form_tag user_url(@user), class: "form-signin", method: 'patch' do %>
 <h4>Please confirm your email.  We'll only email you if you have notifications.</h4>
  <%= email_field_tag :email, current_user.email %>
 <h4>Want to be notified when someone needs a player?  Choose which sports below.</h4>
  <%= check_box_tag :basketball, checked = true %> Basketball</br></br>
  <%= check_box_tag :indoor_volleyball, checked = true %> Indoor Volleyball</br></br>
  <%= check_box_tag :beach_volleyball, checked = true %> Beach Volleyball</br></br>
  <%= check_box_tag :soccer, checked = true %> Soccer</br></br>
  <%= check_box_tag :flag_football, checked = true %> Flag Football</br></br>
  <%= check_box_tag :hockey, checked = true %> Hockey</br></br>
  <%= check_box_tag :kickball, checked = true %> Kickball</br></br>
  <%= check_box_tag :softball, checked = true %> Softball
  <%= hidden_field_tag :user_id, :value => current_user.id %>
  <%= hidden_field_tag :user, :value => current_user %>
 <div>
  </br>
  <%= submit_tag "Submit", class:"btn btn-large btn-success" %>
 </div>

コントローラ

  def update
   respond_to do |format|
   if @user.update(update_params)
     format.html { redirect_to @user, notice: 'Updates were successful.' }
     format.json { head :no_content }
    else
     format.html { render action: 'edit' }
     format.json { render json: @user.errors, status: :unprocessable_entity }
    end
   end
  end

  def update_params
    params.permit(:email, :soccer, :softball, :beach_volleyball, :indoor_volleyball, :flag_football, :basketball, :hockey, :kickball)
  end
39
brad

次の例のように、各チェックボックスの前に値が空の隠しフィールドタグを配置する必要があります。

<%= hidden_field_tag :basketball, '' %>
<%= check_box_tag :basketball, checked = true %> Basketball</br></br>

その後、フォームは何も選択されていない場合、そのフィールドに空の値を入力する必要があることを認識します。

78
JellyFishBoy

誰かが列型のブール値を持ち、check_box_tagを使用している場合は、これを見てください。それは私のために働いた。 <%= hidden_field_tag :basketball, 'false' %> <%= check_box_tag :basketball, true, is_checked? %>

5
viks

それを見て

チェックボックスの前に隠しフィールドを配置する主なアイデア。フォームが送信されると、フィールドが解析されます:チェックボックスがチェックされている場合-その値は渡され、そうでない場合は非表示フィールドの値

たとえば、このようなsmth(NOT丸ではありません)

<%= hidden_field_tag :basketball, false %>
<%= check_box_tag :basketball, checked = true %> Basketball</br></br>
3
gotva

問題は、チェックボックスの前に隠し属性を使用し、次のような同じ参照を与える場合です。

_<%= hidden_field_tag :basketball, false %>
<%= check_box_tag :basketball, checked = true %> Basketball</br></br>
_

次に、$("#basketball").removeAttr("checked")のように、属性に対して何らかのタイプの動的アクションを実行する場合、$("#basketball")の最初のインスタンス(この場合は非表示オブジェクト)をターゲットにします。

私の実装でやったことは、デフォルト設定のチェックを外すことになるため、チェックボックスにデフォルト値のfalseを追加することでした。次に、jqueryでチェックボックス要素の変更を検出し、そのチェックボックスのIDを取得しました。変更が検出されたら、checkedプロパティのtrueまたはfalseを評価し、それに応じてvalue属性を設定しました。

_$(".checkbox").on('change', function(e) {
  var that;
  that = "#" + e.target.getAttribute("id");
  if ($(that).prop("checked") === true) {
    $(that).val("true");
  }
  if ($(that).prop("checked") === false) {
    return $(that).val("false");
  }
});_

PUTメソッドフォームアクションを送信すると、空であってもブール値でデータベースレコードが正しく更新されます。

2
CaliCanadian

値を渡すことができるようです。次のコードを参照してください。

check_box_tag 'accept'
<input id="accept" name="accept" type="checkbox" value="1" />

check_box_tag 'rock', 'rock music'
<input id="rock" name="rock" type="checkbox" value="rock music" />

check_box_tag 'receive_email', 'yes', true
<input checked="checked" id="receive_email" name="receive_email" type="checkbox" value="yes" />

check_box_tag 'tos', 'yes', false, :class => 'accept_tos'
<input class="accept_tos" id="tos" name="tos" type="checkbox" value="yes" />

check_box_tag 'eula', 'accepted', false, :disabled => true
<input disabled="disabled" id="eula" name="eula" type="checkbox" value="accepted" />

http://apidock.com/Rails/ActionView/Helpers/FormTagHelper/check_box_tag

1
Kyle