2

我的 Web 应用程序失败的最常见原因之一是用户有时缺少视图期望它具有的某个属性。例如,我的应用程序中的大多数用户在我们的系统中都有教育(学校、学位等)条目,但有些用户没有。假设我的观点是这样的:

<% @educations.each do |education| %>
  <%= education.school %>
  <%= education.degree %>
<% end %>

我想避免“口袋妖怪”异常处理,并认为在用户在我们的数据库中没有教育条目的情况下,必须有更好的方法来处理“nil:NilClass 的未定义方法‘度’”错误. 这似乎是一个丑陋/乏味的修复:

<% @educations.each do |education| %>
  <% if education.school %>
    <%= education.school %>
  <% end %>
  <% if education.degree %>
   <%= education.degree %>
  <% end %>
<% end %>

任何输入表示赞赏。谢谢!

4

2 回答 2

1

只要你知道你正在处理的第一个对象不会是 nil,最简单的方法就是这样做:

- @educations.each do |education|
  = education.try :school
  = education.try :degree

#try方法非常方便。你也可以调用.to_s任何你认为可能为零的东西,即:

- @educations.each do |education|
  = education.school.to_s
  = education.degree.to_s

这会将 nils 转换为空字符串。这在 IMO 视图中没有那么有用,但如果您的输入预期为字符串并且可能为空,则很多时候会派上用场。即像这样的方法:

def put_in_parenthesis(string)
  "(" + string.to_s + ")"
end
于 2012-11-06T22:47:03.203 回答
0

您在这里有几个选择。

最容易实现的是try 方法。它是这样使用的:

<%= education.try( :degree ) %>

问题是这try()被视为一种反模式。如参考所示,您可以通过以下方式实现类似的功能:

<%= education && education.degree %>

在我看来,这在智力上并没有太大的不同。一种更干净地处理这个问题的流行方法是Null Object 模式,它基本上是一个具有定义中性(“null”)行为的对象。

于 2012-11-06T22:52:09.183 回答