我正在做一个Rails 2.3.14项目,它使用0.6.0的i18n gem和2.3.14的ActiveSupport gem。这两个方法都定义了一个Hash#slice方法(i18n's;ActiveSupport's),但它们的功能不同: i18n版本使用Hash#fetch,因此如果缺少任何请求的键,就会引发i18n/core_ext/hash.rb:4:in 'fetch': key not found (IndexError)异常,而ActiveSupport版本会愉快地忽略缺少的键,而ActiveSupport的其余部分则依赖于这种愉快的忽略。
在我的应用程序中,i18n版本是首先加载的(顺便说一句,是因为faker将其作为依赖项加载),所以当ActiveSupport尝试依赖于忽略缺少键的行为时,我会得到异常。
有没有办法让Rails在faker和i18n之前加载ActiveSupport?
发布于 2012-01-12 01:53:27
您也可以在需要gem之后修补Hash类。您只需将ActiveSupport的hash/slice.rb的内容粘贴到应用程序的某个位置即可。URL可以在以下位置找到:
https://github.com/lifo/docrails/blob/master/activesupport/lib/active_support/core_ext/hash/slice.rb
这将覆盖来自gem的定义,所以YMMV。
发布于 2012-01-12 03:49:50
我使用了@Eugene的想法,恢复到ActiveSupport的方法(因此他得到了满意的绿色复选标记),但这样做是为了避免重复代码。首先,我们测试是否使用了i18n版本,如果使用了,则使用remove_method将其清除(它是通过打开类添加的),并让ActiveSupport 2.3.14模块填充(注意,我没有使用undef,这也会清除模块的覆盖)。
这样,代码就进入了初始化器:
begin
{}.slice(:a) # ActiveSupport's slice is fine with this; i18n's is not
rescue IndexError
class Hash
remove_method :slice #kill i18n's implementation, allow the ActiveSupport module to work
end
end发布于 2012-01-12 01:46:40
如果你不能控制加载的顺序,你可以在这篇博文http://banisterfiend.wordpress.com/2010/11/04/baking-module-methods-into-classes-with-alias_method/中尝试这个方法
我用过它,它对我很有效,但那是我自己写的模块。
https://stackoverflow.com/questions/8823968
复制相似问题