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.
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