[RubyOnRails] Implementieren eines Pulldowns für form_with basierend auf Tabellendaten

Inhalt

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.

Umgebung

・ Ruby 2.6.5 ・ Schienen 6.0.3

Vorausgesetzte Situation und was Sie tun möchten

Status

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.

Was du machen willst

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.

(1) Erstellen und Implementieren von Pulldown-Optionen basierend auf Tabellendaten

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.

スクリーンショット 2020-06-29 23.56.04.png

Zwei der gleichen Pulldowns sind aneinandergereiht und einer ist offen. Natürlich wird station.name als Option angezeigt.

② Machen Sie die Registrierung der nächstgelegenen Station optional

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.

スクリーンショット 2020-06-30 0.01.57.png

Jetzt haben Sie das gewünschte Pulldown erfolgreich implementiert.

③ Registrieren Sie alle nächstgelegenen Stationen gleichzeitig, indem Sie das Formular einmal senden

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.

Am Ende

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

[RubyOnRails] Implementieren eines Pulldowns für form_with basierend auf Tabellendaten
So löschen Sie alle Daten in einer bestimmten Tabelle
So implementieren Sie Suchfunktionen in Rails
So implementieren Sie die Datumsberechnung in Java
So implementieren Sie den Kalman-Filter mit Java
So erzwingen Sie Codierungskonventionen in Java
So implementieren Sie Ranking-Funktionen in Rails
Verwendung von Umgebungsvariablen in RubyOnRails
So implementieren Sie die asynchrone Verarbeitung in Outsystems
So überschreiben Sie Firebase-Daten mit Swift
So implementieren Sie eine ähnliche Funktion in Rails
So erstellen Sie einfach ein Pulldown mit Rails
So implementieren Sie optimistisches Sperren in der REST-API
Hinweise zum Schreiben von Kommentaren auf Englisch
So implementieren Sie Paginierung in GraphQL (für Ruby)
So erstellen Sie eine eindeutige Datenkombination in der Schienen-Zwischentabelle
So implementieren Sie die Gastanmeldung in 5 Minuten im Rails-Portfolio
So erstellen Sie einen Daten-URI (base64) in Java
[Ruby On Rails] So setzen Sie die Datenbank in Heroku zurück
Zusammenfassung der Implementierung von Standardargumenten in Java
Hinweise zur Verwendung regulärer Ausdrücke in Java
Verwendung von JSON-Daten in der WebSocket-Kommunikation (Java, JavaScript)
So zeigen Sie Diagramme in Ruby on Rails an (LazyHighChart)
So implementieren Sie eine einzeilige Anzeige von TextView in der Android-Entwicklung
So wechseln Sie Java in der OpenJDK-Ära auf dem Mac
Wie man mit Heroku einsetzt
[Rails] So implementieren Sie Scraping
[Java] So implementieren Sie Multithreading
So implementieren Sie einen Job, der die Java-API in JobScheduler verwendet
So bedienen Sie automatisch einen in Java unter Windows erstellten Bildschirm
So wechseln Sie die Java-Version mit direnv im Terminal auf dem Mac
Abrufen und Hinzufügen von Daten aus dem Firebase Firestore in Ruby
So bringen Sie JDK 11 bequem in den Mac
Wie man Lombok im Frühling benutzt
Implementieren Sie einen tabellengesteuerten Test in Java 14
So finden Sie May'n in XPath
So blenden Sie die Bildlaufleiste in WebView aus
Verwendung der Methode form_with
So stellen Sie Laravel für CentOS 7 bereit
So führen Sie JUnit in Eclipse aus
Wie man in Ruby auf unbestimmte Zeit iteriert
Versuchen Sie, Yuma in Ruby zu implementieren
Wie man eine Ansicht auf Android "aushöhlt"
Hinweise zur Verwendung von Spring Data JDBC
Wie man Ant in Gradle ausführt
Wie man die Programmierung in 3 Monaten beherrscht