For some reason, a simple piece of decorator-code fails on my production machine, but runs fine on development[1].
I dumbed it down, and found that the following is the simplest failing piece:
Spree::Variant.class_eval do
def price=(value)
self.price = normalize_number(value)
end
end
Failing with SystemStackError (stack level too deep):
Debugging shows me that, indeed, the function keeps being called. self.price= calls price=.
What is a usual Rails/Ruby pattern to tackle this? What I want is:
When attribute_foo=(bar) gets called, delegate it to my custom code, where I can run the passed bar trough a small piece of custom code. Then assign that altered bar to attribute_foo.
[1]:
The only difference is the Ruby patch version and the fact that the production machine has 64-bit version, versus 32bit-version on dev: ruby 1.8.7 (2011-02-18 patchlevel 334) [x86_64-linux].
The solition was simple: just use
write_attribute.Spree::Variant.class_eval do
def price=(value)
write_attribute(:price, bar(value))
end
end