web-dev-qa-db-fra.com

Comment faire en sorte que les cases à cocher vides passent comme fausses aux paramètres

J'ai un formulaire qui est un formulaire utilisateur de mise à jour où plusieurs des éléments sont des cases à cocher. Je veux que true passe aux paramètres s'ils sont cochés (cela fonctionne) et false qu'il passe aux paramètres s'ils ne sont pas cochés (ne fonctionne pas). Les éléments non contrôlés ne sont même pas envoyés aux params. Comment puis-je faire passer un article non contrôlé comme faux?

Forme

<%= 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>

Manette

  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

Vous devez placer une balise de champ caché avant chaque case à cocher avec une valeur vide, par exemple:

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

Le formulaire est alors conscient qu'il doit remplir ce champ avec une valeur vide si rien n'est sélectionné.

78
JellyFishBoy

Si quelqu'un a un type de colonne booléen et utilise check_box_tag, regardez ceci. Ça a marché pour moi. <%= hidden_field_tag :basketball, 'false' %> <%= check_box_tag :basketball, true, is_checked? %>

5
viks

Regardez-le

L'idée principale de placer le champ caché avant la case à cocher. Lorsqu'un formulaire est soumis, les champs seront analysés: si la case est cochée - sa valeur sera transmise, sinon la valeur du champ caché

Par exemple smth comme ceci (PAS testicules)

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

Le problème est que si vous utilisez un attribut caché avant une case à cocher et lui donnez la même référence comme ceci:

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

Ensuite, si vous voulez faire n'importe quel type d'action dynamique sur un attribut, disons comme $("#basketball").removeAttr("checked") il ciblera la première instance de $("#basketball") qui dans ce cas est l'objet caché.

Ce que j'ai fini par faire dans mon implémentation, c'était d'ajouter une valeur par défaut false à mes cases à cocher, car mon paramètre par défaut devait être décoché. Ensuite, dans mon jquery, j'ai détecté un changement sur les éléments de la case à cocher et saisi l'ID de cette case à cocher. Lorsqu'une modification est détectée, j'ai évalué la propriété vérifiée pour vrai ou faux et j'ai défini l'attribut value en conséquence.

$(".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");
  }
});

Lorsque je soumets mon action de formulaire de méthode PUT, il met correctement à jour l'enregistrement de base de données avec la valeur booléenne même s'il est vide.

2
CaliCanadian

Il semble que vous puissiez transmettre la valeur. Voir le code suivant:

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