零:当ByeBug报告预期结果时为NilClass

时间:2017-05-11 01:17:15

标签: ruby-on-rails ruby

我正在尝试访问我的污垢/索引页面,但我收到此错误,如下图所示。 first error message

所以我在#total_trip_miles中放了一个byebug来看看发生了什么:

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

当我从byebug拨打collect_trip_miles.round.to_s时,我得到了"55",这正是我想通过我的规范: enter image description here

我在#drivers

中调用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>

这些方法是从我的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

然后控制器操作来自app/controllers/dirts_controller.rb

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

基于我所描述和展示的证据,我的驾驶员模型的方法是否会爆炸,是否有一些超级显而易见的我应该为自己感到羞耻的原因我的localhost但是调试按预期报告了吗?

2 个答案:

答案 0 :(得分:0)

可能是这个吗?

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

您正在视图中迭代drivers.each do |driver|,当您将其传递到show_total_miles_of然后再传递到the_driver时,您不应该find,因为您是已经处理了一个对象的单个实例。

答案 1 :(得分:0)

我犯了一个错误,就是在我的司机系列中没有防范零,其中一些人没有任何行程里程。因此,在没有任何东西的情况下调用#round会引发错误,但它在ByeBug中起作用,因为这只是捕获集合中的一个项目,恰好也有英里数,所以在Float上调用#round工作。