2015-11-05 135 views
0

假設我有一個實例變量@n,在我看來,我打電話給<%= @n.title %>有沒有辦法讓控制檯忽略某些錯誤?

如果@n等於有效記錄,那麼這將正常打印。但是,如果@n是空白或無效的,則整個頁面將顯示錯誤消息,因爲這一小行。

有沒有辦法讓@n.title只打印零如果@n是無效或無效?

我正在尋找一種方法來做到這一點沒有條件的陳述。例如,如果我想打印

<%= @v1.title %>,<%= @v2.title %>,<%= @v3.title %>,<%= @v4.title %>, 

,如果我想使用條件沒有錯誤打印,將需要12行代碼:

<% if @v1 %> 
    <%= @v1.title %>, 
<% end %> 
<% if @v2 %> 
    <%= @v2.title %>, 
<% end %> 
<% elsif @v3 %> 
    <%= @v3.title %>, 
<% end %> 
<% elsif @v4 %> 
    <%= @v4.title %>, 
<% end %> 

這似乎是一個恥辱,上使用12線這個。在打印時能夠完成錯誤處理權限將會很好。

回答

2

你可以用try()方法完全做到這一點。我用它所有的時間。

<%= @n.try(:title) %> 

,將返回nil如果@nnil或者如果title方法上不存在@n

你也可以把它們連在一起就像這樣:

@n.try(:title).try(:to_s) 

甚至使用它的哈希:

@n.try(:[], 'name') # Which is the same as @n['name'] 

http://api.rubyonrails.org/classes/Object.html#method-i-try

EDIT(2016年1月11日)

您現在可以使用「保險箱導航運營商「截至Ruby 2.3.0

@n&.title&.to_s 

還有在Ruby 2.3.0引入的Array#digHash#dig方法。

hash = { 'name' => 'bob' } 
hash.dig('name') # Which is the safe way to do hash['name'] 
+0

你能用這個鏈接嗎?例如,用'<%= link_to @ n.try(:title),raze_path%>',如果'@ n'爲零,則不打印任何內容,而是打印'raze_path'的url輸出。我可以通過鏈接打印什麼嗎? –

0

您可以在視圖中添加一些邏輯來區分開發(其中一些錯誤可以忽略)和生產環境(錯誤應該導致您的應用程序以明顯醜陋的方式失敗)。 Ruby的nil具有「虛假」的性質,所以你可以使用這個概念來獲得你的好處。

<% if Rails.env.development? %> 
    <% if @n %> 
    <%= @n.title %> 
    <% else %> 
    <%= nil %> 
    <% end %> 
<% else %> 
    <%= @n.title %> 
<% end %> 
+0

是否可以在沒有條件語句的情況下完成此操作? –

+0

那麼,首先不要設置「@ n」是「錯誤的」,所以我不確定你的期望在這裏完全是現實的。如果您不想使用條件,請確保在控制器中正確設置字段。在這種情況下,我不確定簡潔的代碼是您的首要任務。您還可以通過將環境測試與'@ n'的測試結合起來,使我的代碼更加簡潔,進一步節省了幾行。 – MarsAtomic

相關問題