Rails Quicktipp: Stolperfalle bei “accepts_nested_attributes_for”

4. Mrz 2010

Gerade bin ich über Fehler gestolpert, der so nicht hätte passieren dürfen.
Ich benutze für eines meiner Projekte neuerdings “accepts_nested_attributes_for”. Dies ist dazu da, in einem nested-form (d.h. Ein Formular mit Eltern und Kindelementen) beim Speichern des Elternelements auch gleichzeitig alle Kindelemente zu speichern. Wirklich gutes Feature. Eine genauere Erklärung bekommt ihr bei Railscasts und in der API.
Aber Achtung Stolperfalle!

Dieser Code stand bei mir im Model und verhinderte erfolgreich (ohne Fehlermeldung), dass Kindelemente gespeichert wurden:

  1. class Hotel < ActiveRecord::Base  
  2.   attr_accessible :kontingent, :name
  3.  
  4.   has_many :hotel_days, :dependent => :destroy  
  5.   accepts_nested_attributes_for :hotel_days
  6.  
  7.   validates_presence_of :name

Eigentlich kein Problem, auch meine Tests liefen ohne Probleme durch. Doch beim Speichern über das Formular selbst wurden die Kindelemente (in diesem Fall hotel_days) nicht gespeichert.
Schuld daran ist die Zeile

  1. attr_accessible :kontingent, :name

denn hier werden nur Kontingent und Name aus dem Formular gespeichert (da nur diese beiden Attribute erlaubt sind), nicht aber die Kindelemente. Ich konnte das Problem mit

  1. attr_accessible :kontingent, :name, :hotel_days_attributes

lösen.

Fazit:
Immer wirklich alle benötigten Formwerte auch über attr_accessible erlauben.

Kategorie: Rails, Tipps | 1 Kommentar »


Veröffentlicht am Donnerstag, den 4. März 2010 um 11:01 Uhr veröffentlicht

Du kannst einen Kommentar schreiben, oder einen Trackback auf deiner Seite einrichten.

Eine Reaktion zu “Rails Quicktipp: Stolperfalle bei “accepts_nested_attributes_for””

 

  1. CakePHP & DIEVOLUTION Blog » Blog Archiv » Ich sollte meine eigenen Tipps öfters lesen… Am 16. Juni 2010 um 11:25 Uhr

    [...] wäre ich gestern nicht schon wieder in die nested_attributes_for Stolperfalle [...]

Einen Kommentar schreiben

Du mußt angemeldet sein, um kommentieren zu können.