Beim Versuch, die Pulldown-Auswahl in form_with einzuführen und zu implementieren, gab es einige Stellen, an denen ich Versuch und Irrtum wiederholt habe, sodass ich sie als Erinnerung belassen werde.
・ Ruby 2.6.5 ・ Schienen 6.0.3
Es gibt einen Shop-Tisch zur Registrierung von Restaurantinformationen. Es gibt eine Stationstabelle, die Stationsdaten auf der Yamate-Leitung als Liste enthält. Die beiden Tabellen haben eine Viele-zu-Viele-Beziehung und bilden über eine Zwischentabelle (shop_station-Tabelle) eine Zuordnung.
Ich möchte die folgenden Funktionen implementieren. ** ① Beim Erstellen von Shopdaten möchte ich die nächstgelegene Station aus dem Pulldown-Menü auswählen und registrieren. ** **. ** ② Die Registrierung der nächstgelegenen Station ist optional und muss nicht registriert werden. Sie können bis zu 2 Stationen registrieren. ** **. ** ③ Natürlich möchte ich alle nächstgelegenen Stationen gleichzeitig registrieren, indem ich das Formular einmal abschicke. ** **.
Ich werde das obige Montageverfahren als Erinnerung belassen.
Nun, ich werde das Verfahren unten schreiben.
Dieses Mal werden wir das Formular in die neue Aktion des Shop-Controllers implementieren. Ich werde zuerst den Code extrahieren und schreiben.
Controller
shops_controller.rb
before_action :set_select_lists, only: [:new]
def new
@shop = Shop.new
end
private
def set_select_lists
@stations = Station.all.map {|station| [station.name, station.id] }
end
View
haml:new.html.haml
.shop-wrapper
= form_with model: [@owner, @shop], html: {class: "shopform"}, local: true do |f|
-#Unterlassung(Einrückung ist geeignet, um die Syntax hervorzuheben. Entschuldigung. Einzug nach Haml-Notation)
= f.select :station_ids, @stations,{},{class: "select"}
= f.select :station_ids, @stations,{},{class: "select"}
* Wenn Sie die nächstgelegene Station registrieren, wird diese in der Suche nach Stationsbezeichnungen angezeigt.
Die Erklärung von jedem ist wie folgt.
Controller @stations erstellt die Daten, die die Grundlage für diese Auswahl bilden. Das Folgende ist eine grobe Erklärung.
Station.all Alle Daten in der Stationstabelle
Station.all.map {~} Für alle Daten (Datensätze) in der Stationstabelle werden alle Daten gemäß {} verarbeitet
Station.all.map {|station| [station.name, station.id]} Generieren Sie einen Hash mit jedem Datensatz als Station, station.name (Wert in der Namensspalte jedes Datensatzes) als Schlüssel und station.id (Wert in der ID-Spalte) als Wert.
View
= f.select :station_ids, @stations,{},{class: "select"}
Senden Sie Daten mit form_with. Erstellen Sie mit f.select ein Pulldown. Senden Sie Daten beim Senden mit dem Schlüssel: station_ids. Die Auswahl basiert auf @stations. Der Klassenname ist select.
Der in der Steuerung definierte Schlüssel ist ** "Auswahlmöglichkeiten, die im Pulldown angezeigt werden" **, und der Wert ist ** "Wert, der von Parametern gesendet wird" **. Wenn Personen auswählen, möchten sie nach Stationsnamen auswählen, und wenn sie Daten registrieren, möchten sie nach ID verknüpfen. Deshalb habe ich den Schlüssel und den Wert so eingestellt.
Die Abbildung, die diese implementiert, ist wie folgt.
Zwei der gleichen Pulldowns sind aneinandergereiht und einer ist offen. Natürlich wird station.name als Option angezeigt.
Da die Liste im vorherigen Bild aus Tabellendaten besteht, ** gibt es keine "Auswahl" für "Keine Station auswählen". ** **. Um das allgemeine "Bitte wählen Sie aus den folgenden" zu machen, habe ich den Controller wie folgt umgeschrieben.
shops_controller.rb
def set_select_lists
@stations = Station.all.map {|station| [station.name, station.id] }.unshift(["Bitte wählen Sie aus den folgenden", nil])
end
Ich habe .unshift (["Bitte unten auswählen", null]) zu @stations hinzugefügt. unshift ist eine Methode, die ein Element ganz am Anfang eines Arrays hinzufügt. Wir haben die Option hinzugefügt, dem Wert Null mit dem Satz "Bitte wählen Sie aus dem Folgenden" als Schlüssel zu übergeben.
Ich entschied, dass das Hinzufügen eines Datensatzes wie "Es gibt keine nächste Station" zu den Tabellendaten selbst die Anzahl der Datensätze in der Zwischentabelle erhöhen würde, und ich entschied, dass dies nicht vorzuziehen ist, und fügte daher die Option hinzu, den Wert auf Null zu setzen.
Jetzt haben Sie das gewünschte Pulldown erfolgreich implementiert.
Ich dachte, ich könnte mich zu diesem Zeitpunkt registrieren, aber als ich die Daten von den Parametern übersprang, traten die folgenden Probleme auf. ** Da beide Pulldowns Daten mit dem Schlüssel mit demselben Namen wie station_ids senden, überschreibt der zweite Wert den ersten Wert und es wird nur ein Wert gesendet. ** **.
Es war offensichtlich, als ich binding.pry betrachtete. Ich möchte hier jedoch mehrere station_ids senden und registrieren. Das heißt, ich möchte ** station_ids als Array ** senden
Ich denke, es gibt verschiedene Möglichkeiten, dies zu tun, aber ich habe die Ansicht wie folgt umgeschrieben (dies ist wahrscheinlich eine Krafttechnik, aber ich konnte sie danach in der Form verwenden).
haml:new.html.haml
= f.select :station_ids, @stations,{},{name: 'shop[station_ids][]', class: "select"}
= f.select :station_ids, @stations,{},{name: 'shop[station_ids][]', class: "select"}
Das Namensattribut wird dem vorherigen Status hinzugefügt. Wenn Sie das Namensattribut in form_with hinzufügen, können Sie ** "Wie senden Sie die Parameter?" ** angeben.
Wenn Sie sich tatsächlich die Parameter in binding.pry ansehen, können Sie sehen, wie die Daten gesendet werden. station_ids werden in der Form ** params [: shop] [: station_ids] ** gesendet.
Ich wollte dies zu einem Array machen, also kann ich durch Hinzufügen von [] am Ende des Namensattributs beide Daten sicher in Form eines Arrays senden.
shops_controller.rb
def shop_params
params.require(:shop).permit(:name, :address, :capacity, :owner_id, :genre_id, :mark_ids,introduces_attributes: [:content, :image, :number],station_ids: [])
end
Übrigens habe ich bereits erwähnt, dass die Daten in Form von params [: shop] [: station_ids] gesendet wurden, also wie oben erwähnt mit dem starken Parameter ** Zuerst erfordern: shop und drücken Sie die Taste darin. Mit Erlaubnis werden die Daten sicher eingegeben. ** **. Ich habe das in binding.pry gut verstanden. War lustig.
Die Methode, die mit dem Attribut name angegeben werden soll, ist sehr leistungsfähig. Sagen Sie mir daher bitte, ob Sie auf eine intelligentere Methode stoßen. Damit wurde jedoch auch jeder Wert des Formulars danach implementiert.
Ich habe am meisten gelernt, indem ich gesehen habe, wie Parameter in binding.pry gesendet werden.
Recommended Posts