2016-02-17 3 views
-1

У меня есть одна файловая программа, которую я пишу под названием Fitgem. Я только что добавил автоматические тесты для Travis CI. Я обнаружил, что в большинстве предыдущих журналов и самотестирования есть ошибки. В нем говорится о следующей ошибке.NoMethodError на идеальный код

fitgem.rb:59:in `full_report': undefined method `steps' for FitbitAccount:Class (NoMethodError) 
    from fitgem.rb:75:in `<main>' 

Предполагается puts из отчета о вашей статистике.

Пожалуйста, найдите мой код в http://github.com/juniorRubyist/fitgem, чтобы помочь мне. Файл fitgem.rb.

Может ли кто-нибудь найти проблему/решение? Спасибо.

+0

Представьте MCVE. И в самом вопросе. –

+0

Я не уверен, но я думаю, что вы вызываете метод 'steps' в классе' FitbitAccount', но метод 'steps' не является методом класса. –

ответ

1

Похоже, вы пытаетесь вызвать метод экземпляра на вашем классе типа, не ваш класс экземпляр. Это ваш код прямо сейчас:

class FitbitAccount 
    ... 

    def steps 
    @response = self.class.get("https://#{@@base_uri}/#{@user_id}/activities/steps/date/today/1d/1min.json", 
     :headers => @authorization_header) 
    @parsed_response = MultiJson.load(@response.body) 
    @parsed_response = @parsed_response["activities-steps"][0]["value"].to_i 
    end 

    def full_report 
    # Full Report 
    puts "Full Report:\n-------" 
    puts "#{self.class.steps} steps" 
    puts "#{self.class.distance} miles" 
    puts "#{self.class.floors} stairs climbed" 
    puts "#{self.class.cals_out} calories burned" 
    end 
end 

self.class возвращает FitbitAccount типа и не относится к текущему объекту класса. Поскольку ваши методы в настоящее время являются методами экземпляра, то есть вам нужно назначить объект FitbitAccount.new, прежде чем вы сможете их использовать, вы получаете NoMethodError. Чтобы исправить эту ошибку, можно заменить все self.class заявления с просто self в вашем FitbitAccount классе, например, так:

class FitbitAccount 
    ... 

    def steps 
    @response = self.get("https://#{@@base_uri}/#{@user_id}/activities/steps/date/today/1d/1min.json", 
     :headers => @authorization_header) 
    @parsed_response = MultiJson.load(@response.body) 
    @parsed_response = @parsed_response["activities-steps"][0]["value"].to_i 
    end 

    def full_report 
    # Full Report 
    puts "Full Report:\n-------" 
    puts "#{self.steps} steps" 
    puts "#{self.distance} miles" 
    puts "#{self.floors} stairs climbed" 
    puts "#{self.cals_out} calories burned" 
    end 
end 

Если вы хотите ваш текущий код, чтобы работать, вы можете сделать ваши методы класса метод вместо instance, добавив ключевое слово self перед именем метода. Вот пример:

class FitbitAccount 
    ... 

    def self.steps 
    @response = self.class.get("https://#{@@base_uri}/#{@user_id}/activities/steps/date/today/1d/1min.json", 
     :headers => @authorization_header) 
    @parsed_response = MultiJson.load(@response.body) 
    @parsed_response = @parsed_response["activities-steps"][0]["value"].to_i 
    end 

    def self.full_report 
    # Full Report 
    puts "Full Report:\n-------" 
    puts "#{self.class.steps} steps" 
    puts "#{self.class.distance} miles" 
    puts "#{self.class.floors} stairs climbed" 
    puts "#{self.class.cals_out} calories burned" 
    end 
end 

Я не советовал бы вам, чтобы сделать их методы класса, хотя, потому что тогда они не будут привязаны к конкретному экземпляру, и кажется, что вы хотите, чтобы иметь возможность создать несколько экземпляров FitbitAccount ,

+0

Это все еще не работает. Есть ли синтаксическая ошибка? Благодарю. – juniorRubyist

+0

'fitgem.rb: 32: в \' шагов ': неопределенный метод \ '[]' для ноль: NilClass (NoMethodError) \t из fitgem.rb: 59: в \' full_report» \t из fitgem.rb: 75 : in \ '

'' – juniorRubyist

+0

Я прокомментировал вам еще одну ошибку. – juniorRubyist

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