0

使用 Collective Idea 的Money Gem对任何东西调用“清理”方法会导致 Rails 3 中出现缺失方法错误

sanitize "trololo"

=>

undefined method `id2name' for {:instance_writer=>false}:Hash

collectiveidea-money (1.7.4) lib/support/cattr_accessor.rb:7:in `block in cattr_reader'
collectiveidea-money (1.7.4) lib/support/cattr_accessor.rb:5:in `each'
collectiveidea-money (1.7.4) lib/support/cattr_accessor.rb:5:in `cattr_reader'
collectiveidea-money (1.7.4) lib/support/cattr_accessor.rb:54:in `cattr_accessor'
actionpack (3.2.8) lib/action_controller/vendor/html-scanner/html/sanitizer.rb:48:in `<class:LinkSanitizer>'
actionpack (3.2.8) lib/action_controller/vendor/html-scanner/html/sanitizer.rb:47:in `<module:HTML>'
actionpack (3.2.8) lib/action_controller/vendor/html-scanner/html/sanitizer.rb:5:in `<top (required)>'
actionpack (3.2.8) lib/action_view/helpers/sanitize_helper.rb:174:in `white_list_sanitizer'
actionpack (3.2.8) lib/action_view/helpers/sanitize_helper.rb:60:in `sanitize'

以前有没有人遇到过这个错误?

4

1 回答 1

4

在源代码中挖掘之后,我发现了这个:money gem 定义了cattr_accessor辅助方法(参见文件 YOUR_GEM_DIR/collectiveidea-money-1.7.4/lib/support/cattr_accessor.rb)和 active_support 一样(参见文件 YOUR_GEM_DIR/activesupport -3.2.8/lib/active_support/core_ext/class/attribute_accessors.rb)。

不幸的是,money gem 中的实现与 active_support 中的不同。在您的情况下,货币gem 已在 active_support 之后加载并覆盖了 *good* active_support 实现。

您可以通过确保在 active_support 之前加载money gem 来“修复”它。如果您发布有关您的应用程序的更多详细信息,我可以告诉您如何执行此操作...

但是,金钱宝石似乎已经过时了,所以我建议您将其替换为更新且积极维护的东西......

于 2012-10-31T18:09:29.327 回答