2017-05-11 1 views
0

Ich versuche auf meine Dirts/Index Seite zuzugreifen, aber ich bekomme diesen Fehler in der folgenden Abbildung. first error messagenil: NilClass, wenn ByeBug das erwartete Ergebnis meldet

Also habe ich eine byebug in dem #total_trip_miles, um zu sehen, was los ist:

class Driver < ApplicationRecord 
    has_many :dirts 
    validates :name, presence: true, uniqueness: true 

    def total_trip_miles 
    byebug 
    collect_trip_miles.round.to_s 
    end 

    def average_speed 
    total_distance = collect_trip_miles 
    total_rate = collect_trip_seconds 

    ((total_distance/total_rate)*3600).round 
    end 

    def collect_trip_miles 
    dirts.map do |trip| 
     trip.distance.to_f 
    end.inject(:+) 
    end 

    def collect_trip_seconds 
    seconds = [] 
    dirts.map do |trip| 
     seconds << trip.change_in_time(trip.start_time, trip.end_time) 
    end 
    seconds.inject(:+) 
    end 

end 

Als ich die collect_trip_miles.round.to_s von rufen byebug ich "55" bekommen, was genau das ist, was ich will meinen spec passieren : enter image description here

ich rufe die Methode von #drivers im dirt/index.html.erb:

<ul id="trips"> 
    <% drivers.each do |driver| %> 
    <li> 
     <article class="driver"> 
     <header> 
      <h2><%= show_name_of(driver) %></h2> 
     </header> 
     <p> 
      <%= "#{show_total_miles_of(driver)} Miles" %> 
     </p> 
     <table> 
     </table> 
     <footer> 
     </footer> 
     </article> 
    </li> 
    <% end %> 
</ul> 

Und diese Methoden aufgerufen werden aus meiner app/helpers/dirts_helper.rb

module DirtsHelper 
    def show_name_of(driver) 
    the_driver(driver).name.capitalize 
    end 

    def show_total_miles_of(driver) 
    the_driver(driver).total_trip_miles 
    end 

    def the_driver(driver) 
    Driver.find(driver.first) 
    end 

    def drivers 
    @driver_store = {} 

    @drivers.each_with_index do |driver, dirts| 
     @driver_store[driver.id] = driver.dirts 
    end 

    @driver_store 
    end 
end 

Und dann die Controller-Aktion kommt von app/controllers/dirts_controller.rb

class DirtsController < ApplicationController 
    def index 
    @drivers = Driver.all 
    end 
end 

Nach dem, was ich beschrieben habe und Beweise gezeigt für gibt es Manch- Super-offensichtlicher-ich-sollte-mich-schämen-von-mir-Grund, warum die Methoden meines Treibermodells in meinem lokalen Host explodieren, aber das Debugging meldet sich wie erwartet?

Antwort

0

Ich habe den Fehler gemacht, nicht gegen Nil in meiner Sammlung von Fahrern zu schützen, einige von ihnen haben keine Meilen. Also ruft #round on nothing einen Fehler auf, aber es funktioniert in ByeBug, weil das nur ein Element in der Sammlung erfasst, das gerade so zufällig auch Meilen hat und so #round auf dem Float aufruft.

+0

Froh, dass du es herausgefunden hast. – dps

0

Könnte es das sein?

def the_driver(driver) 
    Driver.find(driver.first) 
end 

Du drivers.each do |driver| Ihrer Ansicht nach Iterieren, tun, wenn Sie es in show_total_miles_of passieren und dann anschließend the_driver, sollten Sie nicht zu find es haben, wie Sie bereits mit einer einzigen Instanz eines Objekts zu tun ist.

+0

Vielleicht. Das Interessante ist, wenn ich in Byebug bin, ist die Art und Weise, wie es eingerichtet ist, der einzige Weg, den ich entdecken könnte, um auf die #total_trip_miles zuzugreifen. Also, vielleicht mache ich etwas, das nicht so strukturiert sein sollte, wie ich es habe. – timproctor

Verwandte Themen