2012-05-20 2 views
0

내가 어떤 모델에 유효성 검증 메소드를 호출 할 때마다, 나는 다음과 같은 오류가 발생합니다 :유효성 검증 오류 - 정의되지 않은 메소드`zero? '

NoMethodError: undefined method `zero?' for nil:NilClass 

이 나타납니다 내 사용자 정의 배열 클래스에서 기능 합을 제거하면 오류가 멀리 갈 것입니다 :

class Array 
    def sum 
    inject(nil) { |sum,x| sum ? sum+x : x } 
    end 
.. 

왜 이런 일이 발생합니까? 어떻게이 문제를 해결하고 여전히 합계 기능을 유지할 수 있습니까? (그것이 다른 컬렉션에 사용할 수 있도록 실제로 Enumerable에서 모듈)

답변

1

레일은 이미 배열에 대한 sum 기능을 제공

그것은 두 가지 측면에서 함수와 다른

:

  • [].sum 0을 반환 기본적으로보다는 전무
  • 그것은 블록, 즉 [1,2,3].sum {|x| x * 2} 반환을 받아 12

백 트레이스 없이는 말할 수 없지만 아마 레일에있는 코드 중 일부는이 두 가지 동작 중 첫 번째 동작에 의존하고있을 것입니다. sum 기능의 정의를 삭제하면 모두 올바르게 수행됩니다. 빈 목록의 합계가 nil이 필요한 경우 레일즈의 합계 메소드는 선택적 인수로 빈 목록을 반환합니다.

+0

이 기능 (가중치가 적용된 임의의 배열) (http : // dzone)으로 구현했습니다. com/snippets/weighted-random-array – Aljaz

+1

레일이 레일스를 정의하기 때문에 합계를 정의 할 필요가 없습니다. 아마도 링크 된 코드의 작성자는 레일의 존재를 가정하고 싶지 않았을 것입니다 (또는 레일의 합계보다 먼저 나타납니다) –

관련 문제