いくつかの要素がチェックボックスである更新ユーザーフォームであるフォームがあります。チェックされている場合は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
次の例のように、各チェックボックスの前に値が空の隠しフィールドタグを配置する必要があります。
<%= hidden_field_tag :basketball, '' %>
<%= check_box_tag :basketball, checked = true %> Basketball</br></br>
その後、フォームは何も選択されていない場合、そのフィールドに空の値を入力する必要があることを認識します。
誰かが列型のブール値を持ち、check_box_tagを使用している場合は、これを見てください。それは私のために働いた。 <%= hidden_field_tag :basketball, 'false' %> <%= check_box_tag :basketball, true, is_checked? %>
チェックボックスの前に隠しフィールドを配置する主なアイデア。フォームが送信されると、フィールドが解析されます:チェックボックスがチェックされている場合-その値は渡され、そうでない場合は非表示フィールドの値
たとえば、このようなsmth(NOT丸ではありません)
<%= hidden_field_tag :basketball, false %>
<%= check_box_tag :basketball, checked = true %> Basketball</br></br>
問題は、チェックボックスの前に隠し属性を使用し、次のような同じ参照を与える場合です。
_<%= 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メソッドフォームアクションを送信すると、空であってもブール値でデータベースレコードが正しく更新されます。
値を渡すことができるようです。次のコードを参照してください。
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