[RUBY] Überprüfen Sie, weil ich die Methode collection_check_boxes im Ralis-Portfolio verwendet habe

Einführung

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.

Was willst du tun

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

Überprüfen Sie, weil ich die Methode collection_check_boxes im Ralis-Portfolio verwendet habe
Ich habe [Klonmethode für Java-Arrays] als Klonmethode in Java-Arrays übersetzt.
Ich war verwirrt, weil es eine Aufteilung im Array gab
Ich habe versucht, die Methode zu erklären
Rufen Sie die Super-Methode in Java auf
Geben Sie das Standard-JAVA_HOME an, das in Buildship verwendet wird
Ich habe versucht, die verwendeten Methoden zusammenzufassen
Ich habe das neue Yuan-Problem in Java ausprobiert
Ich wollte der Methode @VisibleForTesting hinzufügen
Ich war süchtig nach der Rollmethode
Was ist die Hauptmethode in Java?
Ich habe die AutoValue-Bibliothek mit Intellij ausprobiert
[Rails] So bedienen Sie die in der Hauptanwendung verwendete Hilfsmethode mit Administrate