web-dev-qa-db-fra.com

Rails: case à cocher form_for définie sur true ou false si la case est cochée/décochée

J'ai un modèle appelé utilisateurs qui a 2 attributs booléens send_email et send_text. J'ai un formulaire qui modifie le modèle utilisateur et je veux qu'il définisse ces attributs sur true/false selon que la case est cochée ou non. Voici mon formulaire

<%= form_for(@user) do |f| %>
    <div class="field">
        <%= f.label :email %> <br />
        <%= f.text_area :email %> <br />
    </div>
    <div class="field">
        <%= f.label :cell %> <br />
        <%= f.text_area :cell %> <br />
    </div>
    <div class="field">
        <%= f.label "Get Email" %> <br />
        <%= f.check_box :send_email, {}, true, false %> <br />
    </div>
    <div class="field">
        <%= f.label "Get Text" %> <br />
        <%= f.check_box :send_text, {}, true, false %> <br />
    </div>
    <div class="actions">
  <%= f.submit "Submit", class: "button small radius" %>
  <%= link_to "go back", @user, class: "button small radius secondary" %>
</div>
<% end %>

Et voici l'action update du user_controller

def update
    @user = User.find(params[:id])
    @user.update_attributes(params[:user])
    redirect_to @user
end

Le formulaire et la mise à jour semblent fonctionner parfaitement, mais lorsque je soumets ce formulaire avec la case send_email ou send_text cochée, les attributs du modèle utilisateur (send_email, send_text) ne sont pas remplacés par false.

23
user2158382

Rails le fera pour vous lorsque votre formulaire agit sur un objet, laissez simplement tous les éléments supplémentaires sur l'étiquette comme ceci:

<div class="field">
    <%= f.label "Get Email" %> <br />
    <%= f.check_box :send_email %> <br />
</div>

Et tout devrait fonctionner comme prévu. Les cases à cocher seront cochées si l'attribut est vrai, et inversement, l'état coché lorsque vous soumettez le formulaire affectera l'attribut. Le reste de votre code va bien.

46
Matt

Informations supplémentaires sur les formulaires et mise à jour de la base de données

En effet, la dernière réponse est correcte: utiliser la syntaxe form_for suffit et Rails fera l'association sans contrôle: false/vérifié: true pour vous.

<div class="field">
    <%= f.label "Get Email" %> <br />
    <%= f.check_box :send_email %> <br />
</div>

J'ai eu le même problème même avec cette syntaxe. Le fait est que la console du serveur m'a renvoyé Unpermitted parameter: checkbox_value: n'oubliez pas de mettre à jour vos paramètres requis/autorisés à mettre dans params! Et dans mon cas:

# ***_controller.rb
      private
        def operator_params
          params.require(:operator).permit(:name, :website, :checkbox_value, :global)
        end
2
tomsihap

J'ai eu le même problème.

<% @batches.each do |batch| %>
  <div class="name_list<%=cycle('odd', 'even')%>"><li>
    <label><%= check_box_tag "send_sms[batch_ids][]",  batch.id,false,:class=>'right' %>
   <div class="att_list_names"> <%= batch.full_name %></div> </label>
   </li>  </div>
  <% end %>
0
Dhanshree