在進行字符串插值之前確保模型存在的最佳方法是什麼?我有一個變量user
,我需要看看user
的主要是什麼。名爲user_attributes
的表格中包含用戶信息。Rails中可靠的字符串插值
#{user.user_attribute.major.name}
用戶可能沒有指定一個專業,但在這種情況下,他們還沒有一個主要的模型實例。所以當我嘗試獲取主要的名字時,我會得到一個「未定義的類型類型錯誤」的錯誤。有關如何安全地做到這一點的任何建議?
在進行字符串插值之前確保模型存在的最佳方法是什麼?我有一個變量user
,我需要看看user
的主要是什麼。名爲user_attributes
的表格中包含用戶信息。Rails中可靠的字符串插值
#{user.user_attribute.major.name}
用戶可能沒有指定一個專業,但在這種情況下,他們還沒有一個主要的模型實例。所以當我嘗試獲取主要的名字時,我會得到一個「未定義的類型類型錯誤」的錯誤。有關如何安全地做到這一點的任何建議?
你可以避開try
並添加一個方法到模型或裝飾..
def major_name
user_attribute.major && user_attribute.major.name
end
OR
def major_name
user_attribute.major.name if user_attribute.major?
end
檢查:https://codereview.stackexchange.com/questions/28610/handling-nil-trying-to-avoid-try
謝謝!這是我一起去的答案。我喜歡做模型中的邏輯而不是視圖的想法,所以謝謝! – ajk4550
您可以使用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
。
你可以使用lonely operator。它就像try
,但功能稍差(在你的情況下無關緊要)。
user.user_attribute.major&.name
這很可能是「最壞」的答案紅寶石清教徒,但在某些情況下對我的作品:
"#{user.user_attribute.major.name rescue nil}"
這不是要成爲一個紅寶石清教徒或不,這根本不是好的解決方案。 – Leito
@Leito - 爲什麼它不是一個好的解決方案?如果我想要的只是字符串(如果存在),或者如果major不存在則爲空字符串,那麼這是一個合理的解決方案。在我的場景中,我通過插入各種模型方法來構造一個複雜的字符串,其中一些方法可能不存在。我使用這個,它的工作原理。 – Anand
是一種濫用例外(特殊性質)。你不應該期待一個或將其用作條件。還有一個性能問題,請參閱http://stackoverflow.com/a/15397057/637094獲取更多詳細信息。我並不認爲它有效,我知道它確實是一種解決方案,但不是一個好的解決方案。 – Leito
[德米特:這不只是一個好主意。這是法律。](http://devblog.avdi.org/2011/07/05/demeter-its-not-just-a-good-idea-its-the-law/) – Stefan