2016-02-17 66 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

我不太確定,但我認爲你正在調用'FitbitAccount'類的方法'steps',但'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語句用簡單selfFitbitAccount類,如下所示:

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 

如果你想你目前的代碼工作,你可以讓你的方法方法,而不是實例方法通過在方法名稱前添加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:in \'steps':undefined method \'[]'for nil:NilClass(NoMethodError) \t from fitgem.rb:59:in \'full_report' \t from fitgem.rb:75 :在'

'' – juniorRubyist

+0

我評論你另一個錯誤。 – juniorRubyist