0

我觉得我在犯语法错误。

我试图在模型中定义一个实例方法,然后用实例接收器调用它。但输出是 nilClass。

我究竟做错了什么?

模型

class Park < ActiveRecord::Base

  has_many :reviews

  def percentages
    @percentages = Array.new(5, 0)
    if reviews.any?
      5.downto(1).each_with_index do |val, index|
        @percentages[index] = (reviews.with_stars(val).size) * 100 / (reviews_count)
      end
      @percentages
    end
  end

end

控制器

class ParksController < ApplicationController

  def show
     @park = Park.find(params[:id])
     @percentages = @park.percentages
  end

end

看法

= @percentages[0]

输出

undefined method `[]' for nil:NilClass
4

1 回答 1

2

您应该在 if 之后显式返回 @percentages。

def percentages
  @percentages = Array.new(5, 0)
  if reviews.any?
    5.downto(1).each_with_index do |val, index|
      @percentages[index] = (reviews.with_stars(val).size) * 100 / (reviews_count)
    end
  end
  @percentages
end

此外,您不需要方法中的实例变量。一个简单的变量就足够了。

def percentages
  percentages = Array.new(5, 0)
  if reviews.any?
    5.downto(1).each_with_index do |val, index|
      percentages[index] = (reviews.with_stars(val).size) * 100 / (reviews_count)
    end
  end
  percentages
end
于 2014-11-17T08:32:35.817 回答