2015-05-08 47 views
1

實現下面的代碼來讀入值並用合適的值填充表,但是當其中一個方法沒有返回任何東西時,它會產生錯誤並導致頁面崩潰。處理由不返回值的方法導致的錯誤的最佳方法?

<tr class="event-row" > 
    <td><%= event.description %></td> 
    <td><%= event.contact.name %></td> 
    <td><%= event.start.strftime('%H:%M') %></td> 
    <td><%= event.end.strftime('%H:%M') %></td> 
    <td><%= link_to "edit", edit_event_path(event) %></td> 
    <td><%= link_to "delete", event, method: :delete, data: {confirm: "Are  you sure?"} %> 
    <td><%= link_to "show", event_path(event) %></td> 
</tr> 

如何檢查方法是否沒有返回值?

+1

你可以說' event.try(:description)''event.try(:contact).name'' event.try(:start)''event.try(:end)'。這不會拋出錯誤 – Sontya

+1

或使用andand寶石,我認爲它稍微好一點。或者使用知道該怎麼做的演示者,那可能更好。 –

+0

@ cockmagic-是的bcoz'event.try(:contact)'是零,我們正在調用'name',這就是爲什麼。你可以嘗試'event.try(:contact).try(:name)'或查看我的答案。如果條件也可以實現這個 – Sontya

回答

4

與如果

<tr class="event-row" > 
    <td><%= event.description %></td> 
    <td><%= event.contact.name if event.contact %></td> 
    <td><%= event.start.strftime('%H:%M') if event.start %></td> 
    <td><%= event.end.strftime('%H:%M') if event.end %></td> 
    <td><%= link_to "edit", edit_event_path(event) %></td> 
    <td><%= link_to "delete", event, method: :delete, data: {confirm: "Are  you sure?"} %> 
    <td><%= link_to "show", event_path(event) %></td> 
</tr> 

您可以使用嘗試 嘗試將返回nil,而不是拋出一個異常

event.try(:description) 
event.try(:contact).try(:name) 
event.try(:start) 
event.try(:end) 

更多的澄清,你也可以檢查,如果該值存在,看看在此

try public method

+0

然後將這個新邏輯移入幫助程序。 –

+0

@FlorentFerry如果用戶想要使用相同的東西次數,將邏輯移入助手是個好主意,以支持DRY priciple – Sontya

1

您可以使用try(:name)代表allow_nil

添加到您的event模式

delegate :name, to: :contact, prefix: true, allow_nil: true 

,這在您的視圖

<td><%= event.contact_name %></td>