2016-05-12 58 views
0

在進行字符串插值之前確保模型存在的最佳方法是什麼?我有一個變量user,我需要看看user的主要是什麼。名爲user_attributes的表格中包含用戶信息。Rails中可靠的字符串插值

#{user.user_attribute.major.name} 

用戶可能沒有指定一個專業,但在這種情況下,他們還沒有一個主要的模型實例。所以當我嘗試獲取主要的名字時,我會得到一個「未定義的類型類型錯誤」的錯誤。有關如何安全地做到這一點的任何建議?

+1

[德米特:這不只是一個好主意。這是法律。](http://devblog.avdi.org/2011/07/05/demeter-its-not-just-a-good-idea-its-the-law/) – Stefan

回答

3

您可以使用try方法:

# if model is present 
{user.user_attribute.major.try(:name)} # => "<MAJOR_NAME>" 

# if model is NOT present 
{user.user_attribute.major.try(:name)} # => "" 

你可以閱讀更多關於try

2

你可以使用lonely operator。它就像try,但功能稍差(在你的情況下無關緊要)。

user.user_attribute.major&.name 
+1

僅適用於Ruby 2.3 – Leito

+0

@Leito:是的,忘了提及,謝​​謝:)你的意思是「2.3+」 –

+0

哈哈哈,你只是未來證明你的答案。 2.3是最新版本,我們不知道這是否會在未來的版本中出現,但我不認爲它會在任何地方出現。 – Leito

-1

這很可能是「最壞」的答案紅寶石清教徒,但在某些情況下對我的作品:

"#{user.user_attribute.major.name rescue nil}" 
+0

這不是要成爲一個紅寶石清教徒或不,這根本不是好的解決方案。 – Leito

+0

@Leito - 爲什麼它不是一個好的解決方案?如果我想要的只是字符串(如果存在),或者如果major不存在則爲空字符串,那麼這是一個合理的解決方案。在我的場景中,我通過插入各種模型方法來構造一個複雜的字符串,其中一些方法可能不存在。我使用這個,它的工作原理。 – Anand

+0

是一種濫用例外(特殊性質)。你不應該期待一個或將其用作條件。還有一個性能問題,請參閱http://stackoverflow.com/a/15397057/637094獲取更多詳細信息。我並不認爲它有效,我知道它確實是一種解決方案,但不是一個好的解決方案。 – Leito