我为这个问题感到困惑。
ActiveSupport::JSON``to_json在各种核心对象上定义,JSON gem也是如此。但是,实现方式并不相同- ActiveSupport版本需要参数,而JSON gem版本则不需要。
ActiveSupport::JSON``to_json
我安装了需要JSON gem的gem,但我的应用程序坏了。问题是我to_json在返回对象列表的控制器中使用,但是我想控制要返回的属性。
to_json
在系统中任何地方进行编码时,都会出现require 'json'此错误消息:
require 'json'
TypeError: wrong argument type Hash (expected Data)
我尝试了一些在线阅读的方法来修复它,但是没有任何效果。我最终重写了gem来ActiveSupport::JSON.decode代替JSON.parse。
ActiveSupport::JSON.decode
JSON.parse
这行得通,但这是不可持续的…我不能每次都想使用需要JSON gem的gem时分叉gem。
更新: 解决此问题的最佳方法是升级到Rails 2.3或更高版本,从而对其进行了修复。
更新 此修复程序仅适用于 <2.3的Rails。正如Giles在下面提到的那样,他们使用几乎相同的技术在内部将其固定在2.3中。但是要当心json gem先前对Rails兼容性(json/add/rails)的 尝试 ,如果明确要求,它将再次破坏一切。
json/add/rails
您是说require 'json'语句本身引发该异常吗?还是说打电话给@something.to_json(:something => value)您时出现错误?后者是我所期望的,如果您在使用JSON gem时遇到问题,那么我不确定会发生什么。
@something.to_json(:something => value)
我刚遇到oauth gem这个问题。在我的情况下,没有真正的冲突,因为oauth gem不依赖于to_json实现。因此,问题在于JSON破坏了ActiveSupport声明。我通过在加载ActiveSupport之前只需要json来解决了这个问题。推杆
里面Rails::Initializer做了把戏(尽管没有把它放在块后面)。
Rails::Initializer
这样,ActiveSupport可以代替默认的JSON实现。
现在,如果您使用的是实际上依赖于JSON实现的gem,to_json那么您就小了。这绝对是元编程中最糟糕的情况,我会提倡让Rails和JSON gem开发人员解决冲突,尽管这会很痛苦,因为彼此之间都必须打破向后兼容性。
在短期内,gem作者可能能够通过支持这两种实现来弥合差距。根据宝石如何使用该方法,这或多或少是可行的。最坏的情况是使用官方分叉(即gem和gem- rails)。
gem
gem- rails