2012-06-20 27 views
3

我正在從Rails模型調用API,如果API返回非200代碼,我想提出一個錯誤。否則,我想緩存/延遲加載數據。這是我的方法:如何在Ruby中返回一個值或有條件地引發錯誤?

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

這個工程,但我想知道如果我能完成這一行。我嘗試使用and運算符與unless結合使用,但無法使其運行。

更新:我已經接受tokland的答案,因爲我問了一條線,他/她提供了兩個非常好的解決方案。最後,我實際上要使用

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

爲了便於閱讀。我只是爲了返回@data而討厭第三條線,因爲很少會出現異常。我覺得odiszapc的答案是簡潔和可讀性的最佳折衷。感謝大家。

+1

您是否嘗試過使用'tap'? –

回答

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)返回零,並且您嘗試使用and運算符,它將不起作用。

這個問題在我身上發生過無數次。示例示例:

nil and puts 'hello' 

在您的irb中嘗試此操作。它不會工作。這個問題與我無數次的發生。

+1

確定,並且由於其「短路」行爲而不會允許「放入」,並且(將永遠不會被忽略!!)。 NO ISSUE !,嘗試放入「Sab」和零:D – Naveed

+0

恐怕我不明白你想說什麼 – sohaibbbhatti

+1

啊抱歉格式化評論不允許我將代碼從正常文本中分離出來,輸出了什麼除了「無,並提出'你好'」? – Naveed

1

嘗試

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

再次@ Sohaib的觀點是正確的,這是不是很可讀!而不是垃圾的方式,很多括號

相關問題