2017-02-18 7 views
1

を通じたアクセス値は、私はそうのような読み込みCalculatorクラスを持っている:ルビー:タップ

class Calculator 
    DEFAULTS = { 
    price: 4.25, size: 10000 
    }.freeze 

    def initialize(lead) 
    @lead = lead 
    end 

    def lead_attributes 
    @lead.attributes.symbolize_keys.merge(DEFAULTS) 
    end 

    def hash # massively simplified 
    lead_attributes.tap do |h| 
     h[:total] = h[:price] * h[:size] 
    end 
    end 
end 

私の問題は、hashメソッドは常に@lead:price6.50との持つにもかかわらず、DEFAULTSから値を返すことです:size8000である。なぜ私の属性は、私はそれらをタップしたときにアクセスすることはできません、要するに

undefined method `*' for nil:NilClass 

:私は@lead.attributesDEFAULTSをマージしていない場合、私はnilにエラーが出ますか?一致する@leadの属性がnilの場合にのみ、DEFAULTSをロードします。

答えて

3

reverse_mergeを使用する(または反対方向にマージする)ことをお勧めします。そうでない場合は、mergeは常に既定値の@lead.attributesを上書きします。

lead_attributesに変更:

def lead_attributes 
    @lead.attributes.symbolize_keys.reverse_merge(DEFAULTS) 
end 

または:

def lead_attributes 
    DEFAULTS.merge(@lead.attributes.symbolize_keys) 
end 
+0

[ 'ハッシュ#のmerge']上の文書への参照(http://ruby-doc.org/core/Hash .html#method-i-merge)が役に立つでしょう。また、単純なルビで 'Hash#symbolize_keys'メソッドはありません。 – mudasobwa

+0

ああ、ありがとう!私の髪の毛を引き裂いて、その上に。 –