2011-03-10 5 views
3

"Project"테이블에 정수 속성으로 인보이스가 있습니다. 여기서는 DB에이 속성에 nil 객체를 넣습니다. 평가 중 nil.empty? 발생합니다. 코드를 실행하는 동안 HAML 확장명에 기록 된 코드ROR + 오류 nil.empty? 실행중인 코드

- @project.each do |proj| 
    =proj.invoice if !proj.invoice.blank? || !proj.invoice.empty? || !proj.invoice.nil? 
    - @project_invoice=proj.invoice 

    [email protected]_invoice=0 if proj.invoice.blank? || proj.invoice.empty? || proj.invoice.nil 

나는이 오류가 발생합니다.

NoMethodError : 예상치 못한 경우 객체가 없습니다. Array의 인스턴스를 예상했을 수 있습니다. nil.empty를 평가하는 동안 오류가 발생 했습니까?

답변

4

도움이 될 수 있습니다 루비와 레일에 의해 제공되는 몇 가지 표준 테스트 거기에 시도 할 수 있지만 일반적으로 한 번에 모두 사용할 필요가 없습니다

# Rails provided Object#blank? method 
nil.blank? # => true 
false.blank? # => true 
''.blank? # => true 
[ ].blank? # => true 

# Ruby provided Object#nil? method 
nil.nil? # => true 
false.nil? # => false 
''.nil? # => false 
[ ].nil # => false 

# Ruby class-specifiC#empty? method 
nil.empty? # => error 
false.empty? # => error 
''.empty? # => true 
[ ].empty? # => true 

아마도 당신이 찾고있는 테스트는 실제로 실제로 다른 테스트 일 것입니다. blank?의 반대는 present?이며, 이와 같은 상황에서는 매우 편리합니다.

- @project_invoice = proj.present? ? proj.invoice : 0 

더 자세하게는 다음과 같습니다 : 당신은 간단한 원 쿼리로 반전 논리적 테스트의 양을 축소 할 수 있습니다

- if (proj.present?) 
    @project_invoice = proj.invoice 
- else 
    @project_invoice = 0 

본 방법은 변수가 nil이 아닌를 나타낸다는 것을 확인 , 어떤 종류의 비 공백 값.

+0

Really Good One,이 단일 명령문은 코드 줄을 줄입니다. 고맙습니다 – Rubyist

+0

@ tadman..so 'empty?'가 문자열, 배열 및 해시에 대해서만 정의되었습니다. 올바른 것입니까? – rubyprince

+0

'비어 있습니까?'String,'Array','Hash' 등 많은 예제에 대해 정의되어 있지만, 정의 할 공통 메소드 이름이기 때문에 다른 것들이 있습니다. 'nil'은 동일한 메소드를 가지고 있지 않습니다. – tadman

0

두 번째 조건의 철자가 틀린 변수 이름이 있습니다. proj이 아니라 projt이 아니면 안됩니다.

그러면 문제가 발생할 수 있습니다.

+0

proj.invoice가 0이면 오류입니다. – DGM

+0

아니요, 같은 문제가 – Rubyist

0

인보이스 열이 nill 인 경우! proj.invoice.blank? false로 평가하고 다음 테스트가 완료되면! projt.invoice.empty?

인보이스가 nil이므로 nil.empty가 있습니까? 어떤 오류입니까? nil에서는 실행할 수 없습니다.

ruby-1.9.2-p0 > !nil.blank? || !nil.empty? 
NoMethodError: You have a nil object when you didn't expect it! 
You might have expected an instance of Array. 
The error occurred while evaluating nil.empty? 

나는 정수가 배열이 아니어야하므로 과잉이라고 생각합니다. 난 그냥 blank?, 너무 빈 배열을 잡으려고 테스트하기 위해 그것을 단축해야한다고 생각합니다.

+0

인 것을 확인했습니다. (proj.invoice.blank? || proj.invoice.empty? || proj.invoice.nil?) 이는! proj.invoice와 논리적으로 같습니다. 공백? &&! proj.invoice.empty? &&! proj.invoice.nil? ...하지만 공백으로 불필요한가? 모든 경우를 처리합니다. – DGM

0

사용중인 코드입니까? 동일한 코드 인 경우 두 번째 줄에 맞춤법 오류가 표시됩니다.

당신은

=proj.invoice if !proj.invoice.blank? || !proj.invoice.empty? || !proj.invoice.nil? 
+1

proj.invoice가 nil 인 경우 .empty를 확인할 수 없습니까? 그 위에. – DGM