ruby-on-rails – 如何处理ActiveSupport :: JSON和JSON gem之间的冲突?

我遇到这个问题.

ActiveSupport :: JSON在各种核心对象上定义了to_json,JSON gem也是如此.但是,实现方式是不一样的 – ActiveSupport版本接受参数,而JSON gem版本没有.

我安装了一个需要JSON宝石和我的应用程序破碎的宝石.问题是我在控制器中使用to_json返回一个对象列表,但是我想控制哪些属性被返回.

当我系统中的任何地方的代码都需要’json’时,我会收到以下错误消息:

TypeError:错误的参数类型哈希(预期数据)

我尝试了几件我在网上阅读的东西来解决它,但没有任何效果.我最终重写了gem,使用ActiveSupport :: JSON.decode而不是JSON.parse.

这个工作,但它是不可持续的…每次我想要使用一个需要JSON宝石的宝石,我不会是宝石.

更新:此问题的最佳解决方案是升级到Rails 2.3或更高版本,修复它.

解决方法

更新此修补程序仅适用于Rails< 2.3.正如Giles在下面提到的,他们在2.3内部使用了相同的技术来修复它.但请注意json gem早期尝试使用Rails兼容性(json / add / rails),如果需要明确地会破坏一切. 你的意思是require’json’语句本身引发了Exception?还是你的意思是当你调用@ something.to_json(:something => value)你得到错误?后者是我期望的,如果你有一个问题需要JSON宝石,那么我不知道发生了什么.

我只是遇到这个问题与oauth宝石.在我的情况下,没有真正的冲突,因为oauth gem不依赖于to_json实现.因此,问题是JSON破坏了ActiveSupport声明.我解决了这一点,只需在加载ActiveSupport之前先要求json.把

require 'json'

里面的Rails :: Initializer做了一个伎俩(虽然把它放在块没有).

这样就可以让ActiveSupport来破坏认的JSON实现.

现在,如果你使用的是一个真正依赖于JSON实现的gem,那么你就是一条小溪.这绝对是最糟糕的元编程,而且我会倡导使用Rails和JSON gem开发人员来解决冲突,尽管这将是痛苦的,因为一个或另一个将不得不打破向后兼容性.

在短期内,宝石作者可以通过支持这两个实现来弥合差距.这或多或少可行,取决于宝石如何使用该方法.最糟糕的情况是官方的分支(即gem和gem-rails).

相关文章

validates:conclusion,:presence=>true,:inclusion=>{...
一、redis集群搭建redis3.0以前,提供了Sentinel工具来监控各...
分享一下我老师大神的人工智能教程。零基础!通俗易懂!风趣...
上一篇博文 ruby传参之引用类型 里边定义了一个方法名 mo...
一编程与编程语言 什么是编程语言? 能够被计算机所识别的表...
Ruby类和对象Ruby是一种完美的面向对象编程语言。面向对象编...