2015-05-08 51 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>