2016-08-05 8 views
0

ActiveSupport :: Configurableを使用する設定オブジェクトを複製/複製する方法を理解する上で問題があります。私はActiveSupport :: Configurableモジュールを使って簡単な設定オブジェクトを作成しています。いくつかの自動化されたテストでは、現在の設定を脇に置き、別の値を持つ新しい設定オブジェクトを作成したいと思います。ActiveSupport ::設定可能な設定オブジェクトは完全にクローン化されません

module App 
    class Config 
    include ActiveSupport::Configurable 

    def self.remember_config 
     @previous_config = @config 
     @config = @config.clone 
    end 
    end 
end 

私はそれを使うと不具合が発生します。私は、remember_configというメソッドを持っています。

App.config.foo = 1 
App.config.foo # Returns 1 
App.previous_config # Returns nil 
App.remember_config 
App.config.foo # Still returns 1 
App.previous_config.foo # eturns 1 
App.config.foo = 2 
App.config.foo # Returns 2 
App.config.previous_config.foo # Also returns 2, but I'd like it to return 1! 

なぜ、最後の行が1ではなく2を返しますか? @previous_configconfigのオブジェクトには、それぞれ異なるobject_idsがあります。多分それはクローンの問題ではないでしょう。おそらく、ActiveSupport :: Configurableの魔法の仕組みに問題があるかもしれません。

答えて

0

クローン関数ではなくdup関数を使用してください。

module App 
    class Config 
    include ActiveSupport::Configurable 

    def self.remember_config 
     @previous_config = @config 
     @config = @config.dup 
    end 
    end 
end 

しかし、クラスをシングルトンクラスとして使用することはできません。

+0

私はdupを試しても動作しませんでした。また、deep_dupメソッドが利用可能で、それもうまくいきませんでした。 – CodeSmith

+0

上記の設定の呼び出しパラメータを私に送信できますか?何も問題がなければ、ファイルやデータベースに書き込むことができます:D –

+0

私は 'ActiveSupport :: Configurable'を削除し、代わりに正規のインスタンス変数を使用しました。 'ActiveSupport :: Configurable'はクローニングに問題があるようです。 – CodeSmith

関連する問題