2015-07-15 3 views
0

Я создал несколько классов с одним методом тестирования, чтобы проверить, что объекты ruby ​​будут правильно сериализованы.NoMethodError undefined method `[] = 'for nil: NilClass

Обнаружена ошибка:

undefined method `[]=' for nil:NilClass 
    from /Users/horse/workspace/queryapi/app/models/query_model.rb:193:in `serialize' 

Я бег ниже test_query метода с помощью консоли рельсов пути инициализации QueryModelTester, а затем вызов метода test_query() на этом объекте.

Мой код:

class QueryModelTester 
    def test_query 
    must = Must.new 
    range_criteria = RangeCriteria.new 
    range_criteria.gte = 20140712 
    range_criteria.lte = 1405134711 

    range = RangeBuilder.new 
    range.search_field = "created_time" 
    range.range_criteria = range_criteria 

    must.range = range 
    bool = Bool.new 
    bool.must = must 

    main_query = bool.serialize 
    puts main_query 
    end 
end 

Вот модели классов выше класса является тестирование:

class RangeCriteria  
    @query_hash = Hash.new 
    attr_accessor :gte, :lte 

    def serialize 
    if(@gte.present?) 
     @query_hash[:gte] = @gte 
    end 

    if(@lte.present?) 
     @query_hash[:lte] = @lte 
    end 

    if(@gte.present? || @lte.present?) 
     return @query_hash 
    end 
    end 
end 


class RangeBuilder 
    @query_hash = Hash.new 
    attr_accessor :search_field, :range_criteria 

    def serialize 
    if(@search_field.present?) 
     @query_hash[@search_field] = @range_criteria.serialize 
     return @query_hash[:range] = @query_hash 
    end 
    end  
end 

class Bool 
    @query_hash = {} 
    attr_accessor :must 

    def serialize 
    if(@must.present?) 
     @query_hash[:must] = @must.serialize 
     return @query_hash[:bool] = @query_hash 
    end 
    end 
end 
+1

Пожалуйста, напишите сообщение 'query_model.rb' – RAJ

ответ

1

Проблема заключается в том, когда вы инициализации @query_hash. Во всех ваших классах они инициализируются в неправильной области. Чтобы исправить это, вы должны двигаться @query_hash = Hash.new к initialize метод, как:

class RangeCriteria 
    def initialize 
    @query_hash = Hash.new 
    end 
    # ... 
end 

class RangeBuilder 
    def initialize 
    @query_hash = Hash.new 
    end 
    # ... 
end 

class Bool 
    def initialize 
    @query_hash = Hash.new 
    end 
    # ... 
end 

Надежда, что помогает.

Удачи вам!

+0

Спасибо. Не уверен, если я все понял. Что делать, если я не использовал конструктор в классе, как/где бы я определял query_hash, чтобы это сработало? Могу ли я использовать родительский класс и просто определить его один раз там, и все классы наследуют его, или я не могу сделать его переменной экземпляра? Просьба уточнить некоторые из этих сомнений, которые у меня есть. Спасибо! –

+0

@HorseVoice, да - вы можете пойти с одним родительским классом, который другие могут наследовать, и сохранить инициализацию '@ query_hash'. Насколько это сработает, я не знаю достаточно о вашем коде, чтобы посоветовать этот конкретный подход. Использование наследования * только для уменьшения количества кода * - не самая лучшая идея, но если все эти классы кажутся подтипом, это может быть хорошим выбором. Не уверен, что это разъясняет или задает больше вопросов (архитектура программного обеспечения непростая), но с ограниченными знаниями о вашей системе это единственный ответ. С уважением! –

 Смежные вопросы

  • Нет связанных вопросов^_^