2017-02-18 16 views
1

У меня Calculator класс, который читает так:Ruby: значения доступа через кран

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 всегда возвращает значения из DEFAULTS, несмотря на @lead имея :price из 6.50 и а :size от 8000. Если я не сливаться DEFAULTS в @lead.attributes я получаю ноль ошибку:

undefined method `*' for nil:NilClass 

Короче говоря, почему бы не мои атрибуты доступны, когда я нажимаю их? Я хочу загрузить DEFAULTS, только если соответствующий атрибут @lead - nil.

ответ

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

Ссылка на документацию на [ 'Hash # merge'] (http://ruby-doc.org/core/Hash .html # method-i-merge). Кроме того, в простом рубине нет метода 'Hash # symbolize_keys'. – mudasobwa

+0

Ах, спасибо огромное! Отрывая мои волосы от этой вещи, ха. –