1

私はi18n gemの 0.6.0と ActiveSupport gem の 2.3.14 を使用する Rails 2.3.14 プロジェクトに取り組んでいます。これらは両方とも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 が ignore-missing-keys 動作に依存しようとすると、例外が発生します。

フェイカーと i18n の前に ActiveSupport をロードするよう Rails に指示する方法はありますか?

4

4 に答える 4

1

私は@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-11T19:49:49.937 に答える
1

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-11T17:53:26.790 に答える
0

ロードの順序を制御できない場合は、このブログ投稿http://banisterfiend.wordpress.com/2010/11/04/baking-module-methods-into-classes-with-alias_method/の方法を試すことができます。

私はそれを使用してうまくいきましたが、それは私が自分で書いたモジュールでした。

于 2012-01-11T17:46:39.553 に答える
0

スライスをより安全にするために、i18n プロジェクトでイシューをオープンし、それを実装するための PR を作成しました。問題 / PR はhttps://github.com/svenfuchs/i18n/pull/292にあります。

自分自身に手動でパッチを適用するif has_key?(key)には、フェッチ後に追加するだけです。

于 2014-10-01T10:39:48.400 に答える