首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何解决I18N的Hash#slice和ActiveSupport的Hash#slice之间的名称冲突

如何解决I18N的Hash#slice和ActiveSupport的Hash#slice之间的名称冲突
EN

Stack Overflow用户
提问于 2012-01-12 01:39:26
回答 4查看 452关注 0票数 1

我正在做一个Rails 2.3.14项目,它使用0.6.0的i18n gem和2.3.14的ActiveSupport gem。这两个方法都定义了一个Hash#slice方法(i18n'sActiveSupport'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?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 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。

票数 1
EN

Stack Overflow用户

发布于 2012-01-12 03:49:50

我使用了@Eugene的想法,恢复到ActiveSupport的方法(因此他得到了满意的绿色复选标记),但这样做是为了避免重复代码。首先,我们测试是否使用了i18n版本,如果使用了,则使用remove_method将其清除(它是通过打开类添加的),并让ActiveSupport 2.3.14模块填充(注意,我没有使用undef,这也会清除模块的覆盖)。

这样,代码就进入了初始化器:

代码语言:javascript
复制
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
票数 1
EN

Stack Overflow用户

发布于 2012-01-12 01:46:40

如果你不能控制加载的顺序,你可以在这篇博文http://banisterfiend.wordpress.com/2010/11/04/baking-module-methods-into-classes-with-alias_method/中尝试这个方法

我用过它,它对我很有效,但那是我自己写的模块。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8823968

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档