0

出于某种原因,一段简单的装饰器代码在我的生产机器上失败了,但在开发[1] 上运行良好。

我把它弄傻了,发现以下是最简单的失败部分:

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

失败了SystemStackError (stack level too deep):

调试告诉我,确实,该函数一直被调用。self.price= 调用价格=。

解决这个问题的常用 Rails/Ruby 模式是什么?我想要的是:

attribute_foo=(bar)被调用时,将其委托给我的自定义代码,在那里我可以通过bar一小段自定义代码运行传递的代码。然后将其分配bar给attribute_foo。

[1]:唯一的区别是 Ruby 补丁版本和生产机器有 64 位版本的事实,而 dev: 上是 32 位版本ruby 1.8.7 (2011-02-18 patchlevel 334) [x86_64-linux]

4

1 回答 1

0

解决方案很简单:只需使用write_attribute.

Spree::Variant.class_eval do def price=(value) write_attribute(:price, bar(value)) end end

于 2012-04-17T12:27:21.383 回答