Komisches Problem mit Association

Liebe Ruby on Railer,

ich habe ein komisches Problem - weiß gerade garnicht, wie ich es
schildern
soll, aber vielleicht klingelt es ja doch bei einem von Euch und Ihr
habt
einen schnellen Tipp für mich.

Ich habe folgendes Datenmodell:
Order has_one Lastschrift

Sowohl in meinen Functional Tests und über script/console kann ich auch
so
etwas sagen wie:
o = Order.new
l = Lastschrift.new
o.lastschrift = l
o.save

Das spricht für mich dafür, dass ich an dieser Stelle alles richtig
gemacht
habe.

Im “richtigen” Code habe ich nun eine Order “order”.

order.lastschrift = Lastschrift.new

schlägt fehl:

NoMethodError in StoreController#adresse

You have a nil object when you didn’t expect it!
The error occurred while evaluating nil.klass

RAILS_ROOT: script/…/config/…
Application Trace http://localhost:3000/store/adresse# | Framework
Tracehttp://localhost:3000/store/adresse#| Full
Trace http://localhost:3000/store/adresse#

vendor/rails/activerecord/lib/active_record/associations/association_proxy.rb:147:in
raise_on_type_mismatch' vendor/rails/activerecord/lib/active_record/associations/has_one_association.rb:44:in replace’
vendor/rails/activerecord/lib/active_record/associations.rb:908:in
lastschrift=' app/controllers/store_controller.rb:113:in adresse’

Ich habe in die Active Record Klasse association_proxy.rb geschaut, hier
ist
folgender Code:

    def raise_on_type_mismatch(record)
      unless record.is_a?(@reflection.klass)
        raise ActiveRecord::AssociationTypeMismatch, "#{@

reflection.class_name} expected, got #{record.class}"
end
end

Dort ist die Variable @reflection nil.

Um das ganze noch etwas unverständlicher zu machen, musste ich
feststellen,
dass auch ein order.to_yaml einen Fehler produziert:
TypeError in StoreController#adresse

wrong argument type nil (expected Data)

RAILS_ROOT: script/…/config/…
Application Trace http://localhost:3000/store/adresse# | Framework
Tracehttp://localhost:3000/store/adresse#| Full
Trace http://localhost:3000/store/adresse#

/usr/local/lib/ruby/1.8/yaml.rb:387:in emit' /usr/local/lib/ruby/1.8/yaml.rb:387:in quick_emit’
/usr/local/lib/ruby/1.8/yaml/rubytypes.rb:15:in to_yaml' app/controllers/store_controller.rb:112:in adresse’

Das Verhalten ist reproduzierbar (auch nach Neustart von WEBrick und
löschen
der Session-Daten).

Ich benutze folgende Version von Rails etc.:

Ruby version 1.8.5 (i686-darwin8.8.2)
RubyGems version 0.9.4
Rails version 1.2.5
Active Record version 1.15.5
Action Pack version 1.13.5
Action Web Service version 1.2.5
Action Mailer version 1.3.5
Active Support version 1.4.4
Environment development
Database adapter mysql
Database schema version 8

Also, falls jemand ein ähnliches Problem hat oder eine Idee, ich bin für
Hinweise sehr dankbar!

Schöne Grüße,

Björn

Hi Björn,

sehr komischer Fehler. Kannst du mal versuchen, statt
o.lastschrift = Lastschrift.new

die build methode zu nutzen:
o.build_lastschrift

Ansonsten könnte es sein, dass Rails eine deiner Klassen nicht korrekt
lädt, aber warum weiß ich nicht.
Interessant wäre dann noch das Order Model…
Hast du noch irgendwelche Plugins?

Gruß
Thomas

Hallo Thomas,

danke für Deine Antwort!
Es kommt noch komischer:
wie gesagt, in den Functional Tests und in der Konsole gehen die
Assoziationen ja.

Aber jetzt: die Order hat auch noch je eine has_one-Beziehung zu
person_rechnung und zu person_versand.
Wenn ich order.lastschrift = @lastschrift mache bevor ich
person_rechnung
und person_versand zuweise, kriege ich keinen Fehler:

  order.lastschrift = @lastschrift
  order.person_rechnung = @person_rechnung
  order.person_versand = @person_versand

So aber schon:
order.person_rechnung = @person_rechnung
order.person_versand = @person_versand
order.lastschrift = @lastschrift

Du fragtest nach meiner Order Klasse:

Hier liegt sie:
http://pastie.caboo.se/115391

Die Sache mit der Reihenfolge und der Tatsache, dass to_yaml nicht geht
macht wirklich etwas Angst …

Björn

Und damit hat sich mein Problem auch geklärt:

In order.rb stand:

has_one :lastschrift

und in lastschrift:

belongs_to :order

Das muss genau umgekehrt sein.

Warum der Fehler nun von der Reihenfolge abhängig war, ist mir ehrlich
gesagt so schleierhaft, dass ich jeden verstehen kann, der mir das nicht
glaubt :slight_smile:

Ich würde mir wünschen, vom Framework hier eine Fehlermeldung zu
bekommen.

Danke für Dein Nachfragen, Thomas,