Ich benutze Rails 3.2.0.rc2 . Ich habe eine Model
, in der ich eine Statik habe, Array
die ich über ein Formular anbiete, so dass Benutzer eine Teilmenge von auswählen Array
und ihre Auswahl in der Datenbank speichern können, die in einer einzelnen Spalte in gespeichert ist Model
. Ich habe serialize für die Datenbankspalte verwendet, in der das gespeichert Array
ist, und Rails konvertiert die Benutzerauswahl korrekt in Yaml (und zurück in ein Array, wenn diese Spalte gelesen wird). Ich verwende eine Mehrfachauswahl-Formulareingabe, um eine Auswahl zu treffen.
Mein Problem ist, dass, so wie ich es derzeit habe, alles so funktioniert, wie ich es erwarten würde, außer dass das Subset-Array des Benutzers immer ein leeres erstes Element hat, wenn es an den Server gesendet wird.
Dies ist keine große Sache, und ich könnte Code schreiben, um das nachträglich auszuschneiden, aber ich habe das Gefühl, dass ich nur einen syntaktischen Fehler mache, da es mir nicht so vorkommt, als ob das Standardverhalten von Rails absichtlich wäre Fügen Sie dieses leere Element ohne Grund hinzu. Ich muss etwas verpasst oder vergessen haben, eine Einstellung zu deaktivieren. Bitte helfen Sie mir zu verstehen, was mir fehlt (oder verweisen Sie mich auf eine gute Dokumentation, die dies ausführlicher beschreibt als das, was ich auf den Zwischenrohren finden konnte).
MySQL-Datenbanktabelle 'Modelle':
- enthält eine Spalte mit dem Namen
subset_array
TEXT
Das Klassenmodell enthält die folgenden Einstellungen:
serialize :subset_array
ALL_POSSIBLE_VALUES = [value1, value2, value3, ...]
Das Formular zum Bearbeiten von Modellen enthält die folgende Eingabemöglichkeit:
f.select :subset_array, Model::ALL_POSSIBLE_VALUES, {}, :multiple => true, :selected => @model.subset_array
Das PUT vom Client auf den Server sieht ungefähr so aus:
- Angenommen, nur Wert1 und Wert3 sind ausgewählt
"model" => { "subset_array" => ["", value1, value3] }
Das Datenbank-Update sieht folgendermaßen aus:
UPDATE 'models' SET 'subset_array' = '--- \n- \"\"\n- value1\n- value3\n'
Wie Sie sehen können, wird dieses zusätzliche leere Element im Array gesendet und in der Datenbank festgelegt. Wie werde ich das los? Gibt es einen Parameter, den ich in meinem f.select
Anruf vermisse ?
Vielen Dank geschätzt :)
BEARBEITEN : Dies ist der generierte HTML-Code aus der f.select
Anweisung. Es sieht so aus, als würde eine versteckte Eingabe generiert, die die Ursache für mein Problem sein könnte. Warum ist das da?
<input name="model[subset_array][]" type="hidden" value>
<select id="model_subset_array" multiple="multiple" name="model[subset_array][]" selected="selected">
<option value="value1" selected="selected">Value1</option>
<option value="value2">Value2</option>
<option value="value3" selected="selected">Value3</option>
<option...>...</option>
</select>
quelle
f.select
generiert wird? Tritt dieses Verhalten auch beim Erstellen auf oder handelt es sich nur um ein Update?f.select
include_hidden: false
mit einem Gotcha geliefert werden. Wenn Sie alle Werte aus dem Auswahlfeld entfernen, enthält die Redewendungmodel.update(something_params)
dieses Feld nicht. TL; DR Sie können das Feld nicht leer machen.Antworten:
Das versteckte Feld verursacht das Problem. Aber es gibt einen guten Grund: Wenn alle Werte abgewählt sind, erhalten Sie immer noch einen Parameter subset_array. In den Rails-Dokumenten (möglicherweise müssen Sie nach rechts scrollen, um all dies zu sehen):
EDIT: Der letzte Absatz schlägt vor, dass Sie den leeren nicht sehen sollten, wenn etwas ausgewählt ist, aber ich denke, dass es falsch ist. Die Person, die dieses Commit für Rails vorgenommen hat (siehe https://github.com/rails/rails/commit/faba406fa15251cdc9588364d23c687a14ed6885 ), versucht, denselben Trick auszuführen, den Rails für Kontrollkästchen verwendet (wie hier erwähnt: https://github.com) / Rails / Rails / Pull / 1552 ), aber ich glaube nicht, dass es für ein Mehrfachauswahlfeld funktionieren kann, da die übergesendeten Parameter in diesem Fall ein Array bilden und daher kein Wert ignoriert wird.
Mein Gefühl ist also, dass dies ein Fehler ist.
quelle
In Rails 4:
Sie können die
:include_hidden
Option übergeben. https://github.com/rails/rails/pull/5414/filesAls schnelle Lösung für den Moment: Sie können jetzt in Ihrem Modell verwenden:
Dadurch werden nur alle leeren Werte auf Modellebene gelöscht.
quelle
In Rails 4+ setzen Sie: include_hidden auf select_tag auf false
quelle
Eine weitere schnelle Lösung ist die Verwendung dieses Controller-Filters:
Diese Methode kann über Controller hinweg wiederverwendet werden, ohne die Modellebene zu berühren.
quelle
http://api.rubyonrails.org/classes/ActionView/Helpers/FormHelper.html#method-i-check_box
So entfernen Sie leere Werte:
quelle
In der Steuerung:
quelle
Ich habe es
params[:review][:staff_ids].delete("")
vor dem Update mit dem im Controller behoben.Aus meiner Sicht:
In meinem Controller:
quelle
Ich mache es möglich, indem ich dies in den Javascript-Teil der Seite schreibe:
Meins sieht eher so aus:
Ich bin mir nicht sicher, ob mir das in Zukunft Kopfschmerzen bereiten wird, aber jetzt funktioniert es einwandfrei.
quelle
Verwenden Sie jQuery:
Option zum Entfernen leerer Optionen aus der Dropdown-Liste.
quelle