[Rails] Fehler beim time_select in Formularen für eingebettete Models

Eingebettete Modelle sind in Rails ein hervorragendes Mittel um Abhängigkeiten zwischen verschiedenen Entitäten herzustellen. Dafür sind die allseitsbekannten belongs_to sowie has_one und has_many aus dem ActiveRecord verantwortlich. Dazu noch ein accepts_nested_attributes und auf der Model-Ebene sind eingebettete Modelle kein Problem.

Wie sieht es aber im Formular zur Eingabe der Daten aus? Auch dort können problemlos mittels fields_for Eingabefelder für ein eingebettetes Model erzeugt werden. Das funktioniert Rails-typisch auch. Bis man auf die Idee kommt in den Eingabefeldern des eingebetteten Models ein time_select mit optionalen Parametern zu nutzen. Wird dem time_select kein optionaler Parameter mitgegeben, läuft die Anwendung wie erwartet. Nicht jedoch, wenn man zum Beispiel mittels :prompt => true den Anwender einen Hinweis geben möchte, was er in den Feldern auswählen kann. Denn dann werden die Parameter, welche von der Form an das Model und von dort an das eingebettete Model übergeben werden, nicht vollständig gefüllt und die Anwendung bricht mit dem Fehler 1 error(s) on assignment of multiparameter attributes ab.

Die Ursache liegt darin, dass Datum und Zeitangaben verkürzt gesagt, als einzelne Integerwerte an das Model gesendet werden. Dieses interpretiert nun die übermittelten Werte, sortiert nach dessen Index, als Jahr, Monat, Tag, Stunde, Minute und so weiter. Der Formhelper time_select hat nun den Fehler, dass wenn er mit optionalem Parameter genutzt wird, keine versteckten Eingabefelder mit den Werten 0 für das Jahr, den Monat und den Tag anlegt. Somit sind diese Werte, wenn sie im Model interpretiert werden, nicht deklariert und ActiveRecord streikt.

Abhilfe schafft dieser Patch für Rails. Nun ist es eine schlechte Idee sein Rails lokal zu patchen. Spätestens beim Deployment auf dem Server tritt der Fehler wieder auf. Also hilft hier nur, das entsprechend eingebettete Model direkt mit der im Patch enthaltenen Funktionalität auszustatten. Folgende Zeilen Code im Model erlauben ab sofort time_select Helper für das Model:

Bleibt trotzdem zu hoffen, dass der Fehler in einer der nächsten Rails-Version behoben wird.

[Rails] Fehler beim time_select in Formularen für eingebettete Models
Markiert in:     

Kommentar verfassen