2014-11-17 7 views
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 
+0

'@ park'에 대한 리뷰가 있습니까? 그렇지 않으면 '박 # 백분율'에서 '없음'이 반환됩니다. –

+0

조건이 정의 된 배열을 무시한다고 말하고 있습니까? – ahnbizcad

+0

'파크 # 백분율'? 나는 인스턴스 메소드를 정의하고 있다고 생각했습니다. 나는 혼란 스럽다 =] – ahnbizcad

답변

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 
+0

고맙습니다. 처음에는 일반 변수를 사용했지만 인스턴스를 만들면 효과가 있다고 생각했습니다. (당신이 붙어 있다면 당신은 당신이 생각할 수있는 다른 것을해라!) – ahnbizcad