2013-02-06 4 views
-1

왜이 작은 코드 스 니펫 (CSS 클래스가있는 탐색 도우미)을 사용하면 elseif 행에 undefined method 'include?' for nil:NilClass이 표시됩니까?로컬 변수가 아니어야합니다. (자체 표현식에 할당)

page_classes_string은 'oddchap oddchap_zoidberg oddchap_zoidberg_index'와 유사 할 수 있습니다. 나는이 방법의 목적은 분명하다 생각 :

  1. 현재 page_stringpage_classes_string을 비교하고 적절한 클래스 이름의 문자열을 반환은 '_index을'이 포함 된 경우 page_classes_string의 마지막 단어를 제거하십시오 일부 탐색을 위해.

나는이 코드를 irb에서 시도했지만 물론 작동하지만 내 중개자 구성에서는 작동하지 않습니다. 또한 제 3 변수를 사용하여 제 'page_classes_string'에 할당 된 변수를 다시 작성할 수는 있지만, 성가신 것 같습니다. 어떤 제안?

물론 다음 변수 이름에 첨부 된 _string은 명확히하기위한 것입니다.

def nav_active(page_string) 
    if page_classes_string.match(/_index/) 
    page_classes_string = page_classes_string.split(/ /)[0..-2].join(' ') 
    end 

    if page_classes_string == page_string 
    'active' 
    elsif page_classes_string.include? page_string 
    'semiactive' 
    else 
    nil 
    end 
end 
+0

조건부 값 외에도 'page_classes_string'에 값을 할당하고 있습니까? –

+0

'page_classes_string' 그 자체는 현재 열려있는 페이지 - 트리의 모든 이름이 연결된 문자열을 포함하고 절대적으로 비어있는 헬퍼입니다. – cseelus

+2

다시 확인하십시오. 적어도 가끔은 분명히 '전혀 (nil)'입니다. 'page_classes_string'은 메소드의 이름입니까? 그렇다면 같은 이름의 변수에 값을 할당하지 않는 것이 좋습니다. –

답변

1

나는 page_classes_string 제거하고 간단하게 CSS 클래스를 개최하는 새로운 클래스를 만들하기 건의 할 것입니다. 당신이 현재 page_classes_string을 생성하는 방법에 따라, 나는 너무 파괴 될이 상상하지 않습니다

class PageClassCollection 
    attr_reader :css_classes 

    def initialize(*classes) 
    @css_classes = classes 
    end 

    def to_s 
    css_classes.join(' ') 
    end 

    def non_index_classes 
    css_classes.select {|c| !c['_index']} 
    end 

    def nav_active?(page_string) 
    return 'active' if non_index_classes == [page_string] 
    return 'semiactive' if non_index_classes.include? page_string 
    nil 
    end 
end 

당신은 다음과 같이 사용합니다 : 당신은 여전히로 변환해야하는 경우

page_classes = PageClassCollection.new('oddchap', 'oddchap_zoidberg', 'oddchap_zoidberg_index') 
page_classes.nav_active?('oddchap') #=> 'semiactive' 

문자열 인 경우 .to_s이 처리합니다 (예 : "#{page_classes}"과 같이 문자열 보간을 사용하면 자동으로 호출됩니다).