2012-06-20 4 views
3

Rails 모델에서 API를 호출 중이며 API가 200이 아닌 코드로 반환되면 오류가 발생합니다. 그렇지 않으면 데이터를 캐싱/지연로드하려고합니다. 이것은 내 방법입니다.Ruby에서 값을 반환하거나 조건부로 오류를 발생시키는 방법은 무엇입니까?

이 작업은 가능하지만 한 줄로 처리 할 수 ​​있는지 궁금합니다. 나는 unless과 결합 된 and 연산자를 사용했지만 작동하지 못했습니다.

업데이트 : 한 줄을달라고 요청했기 때문에 tokland의 대답을 받아 들였고 두 가지의 아주 좋은 해결책을 제공했습니다. 결국 나는 실제로 사용하려고합니다. 가독성을 위해 실제로 사용하려고합니다.

def data 
    @data ||= SNL.get_list(name) 
    @data.success? ? @data : (raise StandardError, @data.inspect) 
end 

예외가 거의 발생하지 않기 때문에 단지 @data을 반환하는 제 3 행을 갖는 것이 싫었습니다. odiszapc의 대답은 간결하고 가독성이 가장 좋은 절충안이라고 생각합니다. 모두에게 감사드립니다.

+1

'탭'을 사용해 보셨습니까? –

답변

2

나는 한 줄을 쓰기 긴장하지 않을,하지만 당신은 절대적으로해야하는 경우가 tap를 사용할 수 있습니다

단락 로직 또한
def data 
    (@data ||= SNL.get_list(name)).tap { |d| d.success? or raise StandardError.new(d.inspect) } 
end 

:

def data 
    (@data ||= SNL.get_list(name)).success? && @data or 
    raise StandardError.new(@data.inspect) } 
end 
1

어쩌면

def data 
    @data ||= SNL.get_list(name) 
    @data.success? ? @data : (raise StandardError, @data.inspect) 
end 

또는 잘 모르겠어요, 뭔가 같은 :

def data 
    (@data ||= SNL.get_list(name)).success? ? @data : (raise StandardError, @data.inspect) 
end 
2

당신은 단지 terneray 연산자를 사용할 수 있습니다. 그러나 코드를 가능한 읽기 쉽게 유지하는 것이 중요하다고 생각합니다. 일반적으로 내 경험에 비추어 볼 때, 수평 적으로 너무 많이 퍼지는 코드는 일반적으로 따라하기가 다소 어렵습니다.

확실한 점이 하나 있습니다. SNL.get_list(name)이 nil을 리턴하고 and 연산자를 사용하려고하면 작동하지 않습니다.

이 문제는 저와 여러 번 일어났습니다. 샘플 예 :

귀하의 irb에서 시도해보십시오. 그것은 작동하지 않습니다. 이 문제는 저와 함께 여러 번 발생했습니다.

+1

ok, "단락 회로"동작으로 인해 'puts'가 호출되는 것을 허용하지 않으며, false 및 (무시할 수있는 것은 무엇입니까?). 문제가 없습니다! 시도해보십시오 "Sab"와 nil : D – Naveed

+0

당신이 말하고자하는 바를 이해할 수 없습니까? – sohaibbbhatti

+1

아, 서식을 지정해 주셔서 감사합니다. 정상적인 텍스트와 코드를 구분할 수 없었습니다. "nil에서 제외하고"안녕하세요 ""? – Naveed

1

이 꽤 읽을 수 없습니다 유효 Sohaib의 포인트 @ 다시

def data 
    (@data ||= SNL.get_list(name)).success? ? @data : raise(StandardError, @data.inspect) 
end 

을 시도! 아닌 쓰레기의 방법, 괄호의 많은

관련 문제