2011-03-24 49 views
3

我正在编写一个到Fluidinfo的Ruby接口,使用rest-client gem作为基础。我真的很喜欢如何调用RestClient自动返回正文,除非你调用代码/头/等。方法,我想保留这个功能。问题是我想要让Fluidinfo返回的JSON预分析,因此用户不必担心它。我不会那么在乎,只是在某些情况下Fluidinfo会返回一个值,如"foo",这在技术上不是JSON,所以基本的JSON gem将不会解析它。我使用的是YAJL,它接受这些原始值。如何正确修改/子类RestClient :: Response

我对Ruby非常陌生(主要熟悉Python和Perl),所以我不确定如何做到这一点。我可以仅子类RestClient::Response并覆盖create方法吗?我知道Ruby中可以打开类并重新定义方法,但在这种情况下我不确定这是个好主意。

任何意见,将不胜感激。

回答

1

重新定义create方法RestClient::Response将打破其原有的功能,用于与您的界面并排使用的休息客户端。由于休息客户的宝石是一个经常使用的宝石,这可能不是你想要的。

在这种情况下,我编写了一个包装类,其中包含原始实例的实例,编写别名方法以调用原始实例并重新定义必要的方法。

这个别名可以用一个普通的request方法稍微短一点,它会将send作为原始实例;那么别名只能调用request :method_name, *args

这样我打包休息客户端作为存储cookie的简单用户代理工作,并在每个请求之前重新定义全局类变量RestClient.proxy变量。我需要rest-client和couchrest(couchrest使用rest-client本身),我希望通过代理自己做休息 - 客户端请求,并做一些直接的请求,我也必须包装。

我知道这不是一个优雅的解决方案,但在我不到一年的红宝石体验中,我知道不是一个更好的解决方案。也许有人向我们展示了一个更好的,我也想读一读。