Ich habe ein Problem mit der Verwendung eines Helfers gefunden, um die Zustände zu enthalten. Es funktioniert perfekt beim Erstellen eines neuen Datensatzes. Wenn ich jedoch einen vorhandenen Datensatz bearbeiten möchte, soll der Status in der Datenbank im Dropdown-Feld vorausgewählt werden. Ich konnte das mit dem Helfer nicht zum Laufen bringen. Es funktioniert jedoch, wenn Sie eine einfache Statustabelle erstellen. Folgendes hat bei mir funktioniert:
Erstellen Sie eine Statustabelle für die Auswahlfeldoptionen
Generieren Sie eine Statusmodelldatei und eine Datenbanktabelle, die nur Spalten für Statuscode und Statusname enthalten (oder wie auch immer Sie sie aufrufen möchten).
rails g model State state_code:string:uniq state_name:string --no-timestamps --no-test-framework
. Dadurch wird eine Migrationsdatei im Ordner db / migrate generiert. Wenn Sie keine ID-Spalte möchten, können Sie diese bearbeiten, indem Sie sie , id: false
in die Blockdeklaration create_table einfügen .
class CreateStates < ActiveRecord::Migration
def change
create_table :states, id: false do |t|
t.string :state_code, null: false
t.string :state_name
end
add_index :states, :state_code, unique: true
end
end
Und migrieren Sie die Datenbank rake db:migrate
.
Sie können die Tabelle mit der Seed-Datei füllen. Stellen Sie sicher, dass Sie alle zuvor geladenen Daten in der Seed-Datei löschen oder auskommentieren, damit Sie keine Duplikate hinzufügen.
states = State.create!([
{ state_name: 'Alaska', state_code: 'AK' },
{ state_name: 'Alabama', state_code: 'AL' },
{ state_name: 'Arkansas', state_code: 'AR' },
{ state_name: 'Arizona', state_code: 'AZ' },
{ state_name: 'California', state_code: 'CA' },
{ state_name: 'Colorado', state_code: 'CO' },
{ state_name: 'Connecticut', state_code: 'CT' },
{ state_name: 'District of Columbia', state_code: 'DC' },
{ state_name: 'Delaware', state_code: 'DE' },
{ state_name: 'Florida', state_code: 'FL' },
{ state_name: 'Georgia', state_code: 'GA' },
{ state_name: 'Hawaii', state_code: 'HI' },
{ state_name: 'Iowa', state_code: 'IA' },
{ state_name: 'Idaho', state_code: 'ID' },
{ state_name: 'Illinois', state_code: 'IL' },
{ state_name: 'Indiana', state_code: 'IN' },
{ state_name: 'Kansas', state_code: 'KS' },
{ state_name: 'Kentucky', state_code: 'KY' },
{ state_name: 'Louisiana', state_code: 'LA' },
{ state_name: 'Massachusetts', state_code: 'MA' },
{ state_name: 'Maryland', state_code: 'MD' },
{ state_name: 'Maine', state_code: 'ME' },
{ state_name: 'Michigan', state_code: 'MI' },
{ state_name: 'Minnesota', state_code: 'MN' },
{ state_name: 'Missouri', state_code: 'MO' },
{ state_name: 'Mississippi', state_code: 'MS' },
{ state_name: 'Montana', state_code: 'MT' },
{ state_name: 'North Carolina', state_code: 'NC' },
{ state_name: 'North Dakota', state_code: 'ND' },
{ state_name: 'Nebraska', state_code: 'NE' },
{ state_name: 'New Hampshire', state_code: 'NH' },
{ state_name: 'New Jersey', state_code: 'NJ' },
{ state_name: 'New Mexico', state_code: 'NM' },
{ state_name: 'Nevada', state_code: 'NV' },
{ state_name: 'New York', state_code: 'NY' },
{ state_name: 'Ohio', state_code: 'OH' },
{ state_name: 'Oklahoma', state_code: 'OK' },
{ state_name: 'Oregon', state_code: 'OR' },
{ state_name: 'Pennsylvania', state_code: 'PA' },
{ state_name: 'Puerto Rico', state_code: 'PR' },
{ state_name: 'Rhode Island', state_code: 'RI' },
{ state_name: 'South Carolina', state_code: 'SC' },
{ state_name: 'South Dakota', state_code: 'SD' },
{ state_name: 'Tennessee', state_code: 'TN' },
{ state_name: 'Texas', state_code: 'TX' },
{ state_name: 'Utah', state_code: 'UT' },
{ state_name: 'Virginia', state_code: 'VA' },
{ state_name: 'Vermont', state_code: 'VT' },
{ state_name: 'Washington', state_code: 'WA' },
{ state_name: 'Wisconsin', state_code: 'WI' },
{ state_name: 'West Virginia', state_code: 'WV' },
{ state_name: 'Wyoming', state_code: 'WY' }
])
Führen Sie dann die Rechenaufgabe aus, um die Datenbank zu säen rake db:seed
In Ihrem Formular können Sie dies als Auswahlfeld hinzufügen (ich verwende state_code als Feldnamen, aber Sie können festlegen, dass es nur state oder was auch immer Sie möchten):
<%= f.label :state_code, 'State', class: 'control-label' %>
<%= f.collection_select(:state_code, State.select(:state_name, :state_code),
:state_code, :state_name, {selected: 'CA'}, {class: 'form-control'}) %>
Das Hilfsmethodenformat collection_select in einem Rails-Formularblock lautet f.collection_select(method, collection, value_method, text_method, options = {}, html_options = {})
. Wenn Sie state_code sowohl als Text als auch als Wert des Dropdown-Felds verwenden möchten, ändern Sie im ersten Auswahlargument und in der text_method den Wert: state_name in: state_code (beachten Sie, dass die Reihenfolge von Text und Wert umgekehrt ist). In den Optionen habe ich 'CA' vorausgewählt, aber nur für ein neues Formular, das nicht bearbeitet wurde (oder es überschreibt den Wert jedes Mal mit CA). Sie können dies in ein Leerzeichen ändern {include_blank: true}
oder eine Eingabeaufforderung hinzufügen {prompt: 'Select State'}
oder den ausgewählten oder ersten Wert mit einem leeren Hash als Standard festlegen {}
. Wenn Sie das Feld erforderlich machen möchten, können Sie dies zu den HTML-Optionen hinzufügen{class: 'form-control', required: true}
Jetzt können Sie es in Ihrem Formular aus der Statustabelle ausfüllen und es wählt den Wert beim Bearbeiten eines Datensatzes vor.