0

何らかの理由で、単純なデコレータ コードが実稼働マシンでは失敗しますが、開発環境では問題なく動作します[1]。

私はそれを馬鹿にして、以下が最も単純な失敗部分であることがわかりました:

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

失敗するSystemStackError (stack level too deep):

デバッグすると、実際、関数が呼び出され続けていることがわかります。self.price= は price= を呼び出します。

これに取り組むための通常の Rails/Ruby パターンは何ですか? 私が欲しいのは:

呼び出されたらattribute_foo=(bar)、それをカスタム コードに委任します。そこでは、渡されbarた小さなカスタム コードを介して実行できます。次に、変更barしたものを attribute_foo に割り当てます。

[1]: 唯一の違いは、Ruby パッチ バージョンと、運用マシンが dev: の 32 ビット バージョンに対して 64 ビット バージョンであるという事実です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 に答える