[RUBY] Révision parce que j'ai utilisé la méthode collection_check_boxes dans le portefeuille Ralis

introduction

user.rb

 has_many :habits, dependent: :destroy

habit.rb

belongs_to :user

Relation dans laquelle le modèle utilisateur a plusieurs modèles d'habitudes Le modèle d'habitude a une colonne de type chaîne appelée task et une colonne de type entier appelée complete.

Que veux-tu faire

Je veux ajouter +1 à la colonne complète uniquement pour le modèle d'habitude vérifié Collection_check_boxes peut faire tout cela à la fois avec un seul formulaire Comment écrire c'est comme ça

<%= form_with(model: @user,url: complete_user_path, local: true) do |f|%>
<h4><%= @user.name %></h4>
<p class="pt-3">Douane</p>
<div class="complete-content">
<%= f.collection_check_boxes :habit_ids, @user.habits,:id,:task,checked: false do |b| %>
<%= b.label do %>
<%= b.check_box %>
<%= b.text %>
<% end %>
<% end %>
</div>
<%= f.submit "Envoyer",class: "btn btn-primary m-5"%>
<% end %>

HTML comme ci-dessous est généré

<input type="hidden" name="user[habit_ids][]" value="">

<label for="user_habit_ids_11">
<input type="checkbox" value="11" name="user[habit_ids][]" id="user_habit_ids_11">
fonctionnement
</label>

<label for="user_habit_ids_12">
<input type="checkbox" value="12" name="user[habit_ids][]" id="user_habit_ids_12">
programmation
</label>

<%= f.collection_check_boxes :habit_ids, @user.habits,:id,:task,checked: false do |b| %>

Lors du démontage

model: @ habit_ids de l'utilisateur Stocker dans ce tableau avec nom = utilisateur [habit_ids] []

@ user.habits Génère autant de cases à cocher qu'il y a de modèles d'habitudes que @user a

: id name = user [habit_ids] [] valeur à stocker dans ce cas habit.id

: niveau de tâche Dans ce cas, exécution, programmation

checkd: false Pour une raison quelconque, il a été vérifié par défaut, alors définissez-le sur false

Lors de la réception avec le contrôleur


def complete_params
  params.require(:user).permit(habit_ids: [])
end
29: def complete
    30: @user = User.find_by(id: params[:id])
    31: before_level = @user.level
    32: habit_id = (complete_params)
 => 33: binding.pry


[1] pry(#<UsersController>)> habit_id
=> <ActionController::Parameters {"habit_ids"=>["", "11", "12"]} permitted: true>

Je veux extraire uniquement l'identifiant d'ici. Formulaire rempli

29: def complete
    30: @user = User.find_by(id: params[:id])
    31: before_level = @user.level
    32: habit_id = (complete_params).values.flatten.compact.reject(&:empty?)
 => 33: binding.pry
    34: unless habit_id.empty?
    35: @habit = Habit.find(habit_id)
    36: @habit.each do |h|
    37: h.update_attributes(complete: h.complete += 1)
    38: @user.update_attributes(level: @user.level += 1)
    39: flash[:notice] = "Atteint!"
    40: end
    43: end
    44: @user.level_change(before_level)
    45: redirect_to @user
    46: end

[1] pry(#<UsersController>)> habit_id
=> ["11", "12"]

Cela a fonctionné, mais je me demande s'il y a une meilleure façon

Recommended Posts

Révision parce que j'ai utilisé la méthode collection_check_boxes dans le portefeuille Ralis
J'ai traduit [Méthode Clone pour les tableaux Java] comme méthode Clone dans les tableaux Java.
J'étais confus parce qu'il y avait une scission dans le tableau
J'ai essayé d'expliquer la méthode
Appelez la super méthode en Java
Spécifiez le JAVA_HOME par défaut utilisé dans buildship
J'ai essayé de résumer les méthodes utilisées
J'ai essayé le nouveau yuan à Java
Je voulais ajouter @VisibleForTesting à la méthode
J'étais accro à la méthode du rouleau
Quelle est la méthode principale en Java?
J'ai essayé la bibliothèque AutoValue avec Intellij
[Rails] Comment utiliser la méthode d'assistance utilisée dans l'application principale avec Administrer