2012. szeptember 16., vasárnap

Ruby on Rails izzadás II.

A hiba, amibe korábban beleütköztem felvetett újabb problémákat, amik miatt muszáj volt magam beleásni a problémába. Időközben rájöttem, hogy a rake fájlt a --trace paraméterrel is lehet ám futtatni, így megkapom, hol is szállt el pontosan a végrehajtás.

Az új probléma a következő: a new-val való létrehozás nem pakol az adatbázisba, így amikor később volt egy hivatkozás ennek az objektumnak az id mezőjére (ami a kódból nem kap értéket, a tároláskor töltötte volna ki a rails/hobo), nil értékkel dolgozott tovább a program, így el is vesztette a funkcionalitását. Konklúzió: a new nem tárol az adatbázisba, csak simán létrehozza az objektumot - ahogy egyébként gondolhattam is volna, csak elöntött az átírás után eltűnő hibaüzenetek okozta örömmámor, így nem is néztem tovább azt a programrészt.

És most nézem, félreolvastam a múltkor azt a doksit. Nem a create és a new ekvivalenciáját írta, hanem a new különféle szintaxisait mutatta be.

Tehát a new után hívni kell egy save-et az ActiveRecord-on, hogy adatbázisba kerüljenek az adatok. Kiteszteltem, a create és a find_or_create_by_* metódusok is meghívják a save-et.

A save hatására pedig visszaintegetett a régi ismerős: a nil.update_attribute hiba. A trace-ben pedig természetesen rámutatott a save hívására, illetve az Akarmi osztály definíciójában egy after_save metódusra.

Ez a metódus az Akarmi példányban az egyik mező egyik mezőjét akarja módosítani:
# Akarmi.rb
after_save do |a|
    a.masvalami.update_attribute :masvalami_mezoje, ertek
end
A gond pedig ott volt, hogy az akarmi.masvalami nem volt definiálva, vagyis nil volt. Innen máris érthető a hibaüzenet. :-)

A fentiekből számomra az következik, hogy a masvalami objektumot előbb létre kell hozni, értékül adni akarmi.masvalami-nek és csak azután lehet elmenteni akarmi-t.

A konkrét programban ez nem is megoldható logikailag, mert előbb az akarmit el kéne menteni. Erre megoldásnak azt találtam ki, hogy az after_save metódus magját kikommentezem. Amúgy sem lényeges módosítást hajtana végre, és én is meg tudom csinálni manuálisan, miután rendesen létrehoztam akarmi-t és masvalami-t is.

Jó tudni még, hogy akarmi.save meghívja masvalami.save-et is.

Nincsenek megjegyzések: