2012-04-12 6 views
0

Aus irgendeinem Grund schlägt eine einfache piece of decorator-code auf meiner Produktionsmaschine, aber läuft gut auf Entwicklung [1].Bei Aufruf von attribute_foo = (bar), benutzerdefinierten Code aufrufen, um die Leiste zu ändern

ich dumbed es nach unten, und stellte fest, dass die im Anschluss an die einfachsten Fehler Stück ist:

Spree::Variant.class_eval do 
    def price=(value) 
    self.price = normalize_number(value) 
    end 
end 

mit SystemStackError (stack level too deep):

Failing Debuggen zeigt mir, dass in der Tat, hält die Funktion aufgerufen wird. self.price = Anrufe price =.

Wie sieht ein übliches Rails/Ruby-Muster aus? Was ich will ist:

Wenn attribute_foo=(bar) aufgerufen wird, delegieren Sie es an meinen benutzerdefinierten Code, wo ich die übergebenen bar durch ein kleines Stück benutzerdefinierten Code ausführen kann. Weisen Sie dann das Attribut bar attribute_foo zu.

[1]: Der einzige Unterschied ist die Ruby-Patch-Version und die Tatsache, dass die Produktionsmaschine 64-Bit-Version im Gegensatz zu 32bit-Version auf Dev: ruby 1.8.7 (2011-02-18 patchlevel 334) [x86_64-linux] hat.

Antwort

0

Die Lösung war einfach: einfach write_attribute verwenden.

Spree :: Variant.class_eval tun def Preis = (Wert) write_attribute (: Preis, bar (Wert)) Ende Ende

Verwandte Themen