2014-04-29 3 views
0

레일 3에 Ancestry gem을 사용하여 카테고리 트리를 구성했습니다. 콘솔과 다른 컨트롤러간에 모든 Ancestry 메소드를 사용할 수 있습니다. 하지만 이제 루트와 같은 메서드를 사용하는 데 문제가 있습니까? 및 is_root? 선택한 고양이가 루트 카테고리인지 결정합니다.정의되지 않은 메소드`root? ' nilClass

응용 프로그램 컨트롤러 내부에 내 코드

private 
def set_categories 
    def set_ids 
    case action_name 
    when "index" 

    @origin_cat = Category.find_by_name(params[:category]) 

    if @origin_cat.root? 
    @descendant_ids = @origin_cat.descendant_ids 
    @descendant_prods = Product.where(:category_id => @descendant_ids ).paginate(:per_page=>10, :page=> params[:page]) 
else 

    end 

...... 

내 erorr는 다음과 같습니다

undefined method `root?' for nil:NilClass 
+0

''category' 키가 먼저 값을 가지는지 아닌지를''params' 할 수 있습니다. –

+1

'Category.find_by_name (params [: category])'결과가 없습니다. – lurker

+1

'.root? '에 대한 호출에 아무런 문제가 없습니다; find가 실패했기 때문에 문제는'@ origin_cat'이 nil입니다. 당신은'params [: category]'의 값을 확인해야합니다. –

답변

2

@origin_cat = Category.find_by_name(params[:category]) 

    if @origin_cat && @origin_cat.root? 
    @descendant_ids = @origin_cat.descendant_ids 
    @descendant_prods = Product.where(:category_id => @descendant_ids ).paginate(:per_page=>10, :page=> params[:page]) 
    else 

    end 

또는 당신이 단지 수 있습니다 : 시도와

if @origin_cat.try(:root?) 

, @origin_catnil 경우에도 @origin_cat.root? 사실인지, 다음과 같은 여부를보다

먼저 @origin_cat 여부를 확인해야 할 것은, nil하지 않습니다 오류를 던지는 대신 nil을 반환합니다.

시도에 대한 자세한 내용 here.

2

@origin_cat이 PARAMS의 nil .Make 확인 값 귀하 [: 카테고리] nil

아니다
if @origin_cat.present? && @origin_cat.root? 
    @descendant_ids = @origin_cat.descendant_ids 
    @descendant_prods = Product.where(:category_id => @descendant_ids).paginate(:per_page=>10, :page=> params[:page]) 
else 

end 
+3

왜 그가 당신처럼''사용하지 않을까요? 그것은'if'와 반대의 논리적 의미를 가지므로, 코드가 루트가 아닌 경우에만 실행됩니다. 또한'@ origin_cat'이'nil' 일 때 예외를 해결하지 않습니다. 기본적으로'if @ origin_cat.root? '의 의도를'@ origin_cat.root가 아닌지?'로 바꾼다. –

+1

이것은 여전히 ​​같은 오류를 줄 것입니다. 또한 OP의 논리를 변경합니다. –

+0

@KirtiThorat 죄송합니다. 편집 됨! – Pavan