user.rb
has_many :habits, dependent: :destroy
habit.rb
belongs_to :user
Beziehung, in der das Benutzermodell mehrere Gewohnheitsmodelle hat Das Gewohnheitsmodell verfügt über eine Zeichenfolgentypspalte mit dem Namen task und eine Ganzzahltypspalte mit dem Namen complete.
Ich möchte der vollständigen Spalte nur für das überprüfte Gewohnheitsmodell +1 hinzufügen Collection_check_boxes können dies alles auf einmal mit einem Formular tun Wie man schreibt ist so
<%= form_with(model: @user,url: complete_user_path, local: true) do |f|%>
<h4><%= @user.name %></h4>
<p class="pt-3">Zoll</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 "Senden",class: "btn btn-primary m-5"%>
<% end %>
HTML wie unten wird generiert
<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">
Laufen
</label>
<label for="user_habit_ids_12">
<input type="checkbox" value="12" name="user[habit_ids][]" id="user_habit_ids_12">
Programmierung
</label>
<%= f.collection_check_boxes :habit_ids, @user.habits,:id,:task,checked: false do |b| %>
Beim Zerlegen
Modell: @ Benutzer Habit_ids In diesem Array mit name = user [Habit_ids] [] speichern
@ user.habits Erzeugt so viele Kontrollkästchen, wie es Gewohnheitsmodelle gibt, die @user hat
: id name = user [Habit_ids] [] Wert, der in diesem Fall zu speichern ist
: task lavel In diesem Fall läuft, programmiert
checkd: false Aus irgendeinem Grund wurde es standardmäßig aktiviert. Setzen Sie es daher auf false
Beim Empfang mit dem Controller
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>
Ich möchte nur die ID von hier extrahieren. Vollständiges Formular
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] = "Erreicht!"
40: end
43: end
44: @user.level_change(before_level)
45: redirect_to @user
46: end
[1] pry(#<UsersController>)> habit_id
=> ["11", "12"]
Es hat funktioniert, aber ich frage mich, ob es einen besseren Weg gibt
Recommended Posts