Rails没有错误 - 任何阻止它们的方法?

时间:2013-02-17 22:03:17

标签: ruby-on-rails-3

过去6个月我一直在学习Rails。我觉得这很棒!

但是,我的应用程序获得的99%的错误都是零错误。我要么尝试显示nil字段,要么外键指向已删除的记录。

我在很多地方都有这种类型的代码:

        <% if location.parent != nil %>
          <td><%= location.parent.name %></td>
        <% else %>
          <td></td>
        <% end %>

      <% if location.client_id != nil %>
        <td><%= location.client.client_name %></td>
      <% else %>
        <td></td>
      <% end %>

我真的希望Rails只在字段为零时显示空白!或者,设置一个错误的闪光灯仍然显示页面。相反,页面炸弹。在Heroku上,你会得到“抱歉,有些不对劲......”

有没有办法更好地处理空白字段?是否有更好的方法来编写上述代码?是否有一些我不知道的Rails设置?有没有宝石可以处理这些类型的错误?

2 个答案:

答案 0 :(得分:1)

你应该放置一些foreign key constraintsafter_destroy methods on your associations。这将阻止您的数据库进入不一致的状态。

但除了重构之外,你应该检查一下ActiveSupport以及它对ruby的各种补充。请参阅http://guides.rubyonrails.org/active_support_core_extensions.html

我觉得有三种方法适用于任何我认为对您有帮助的对象:

  • blank? - 如果对象为nil,empty?,false和其他条件,则返回true。有关更好的解释,请参阅the documentation
  • present? - 如果对象不是nil而不是空,则返回true?或者是真的。有关更好的解释,请参阅the documentation
  • try(:foo) - 尝试在对象上调用方法foo,如果对象为零,则返回nil。有关更好的解释,请参阅the documentation

这样您的示例代码可能是:

<td><%= location.parent.try(:name) %></td>
<td><%= location.parent.try(:client_name) %></td>

我真的建议你看看为什么你期望一个对象不是零。迁移中的Foreign key constraintsafter_destroy hooks for your associations将对此有所帮助。

答案 1 :(得分:0)

不是Rails修复,但您可以使用面向对象设计的NullObject模式来重构代码以不同方式处理“nil”。该模式基本上意味着您为一个对象创建一个null / nil类,该对象在nil时处理。它有一些缺点:要维护一个额外的类,你必须记住在添加可能为零的新方法时编辑null类。好处是它将条件移出视图。

这是关于这个主题的好文章: http://robots.thoughtbot.com/post/20907555103/rails-refactoring-example-introduce-null-object

另一个建议是将条件移出您的视图并转移到帮助者中。助手是包含视图逻辑的简单模块。我在视图中遇到了所有逻辑的视图,它使视图代码很快变得混乱。